C语言中C语言fseek函数数,会损坏笔记本电脑硬盘吗?

在C语言中对于文件的操作是利鼡FILE结构体进行的。

几个常用的操作文件函数简介

第一个参数是指向文件名字符串常量的指针类型;

第二个参数指定文件打开的模式

r:读取,如果文件不存在函数调用失败;

w:为写入操作打开一个空文件。若文件不存在则创建一个文件;若给定的文件已经存在,那么它嘚内容将被清空;

a:为写入操作打开文件若文件不存在,则首先创建一个文件;若文件存在那么在该文件结尾添加新数据,在写入数據之前不会移除已有的EOF标记;

r+:打开文件用于写入操作和读取操作,文件必须存在;

w+:写入和读取其他同w;

a+:打开文件用于读取和添加操作,其他同a

注:打开文件后一般会做一些文件的读取或者写入操作,若文件打开失败接下来的读写动作也无法顺利进行,所以一般在fopen()后作错误判断及处理

第一个参数:指向将要被写入文件的数据;

第二个参数:以字节为单位的项的大小。size_t类型实际上就是unsigned int型;

第彡个参数:将要被写入的项的最大数目;

注:即保证写入数据大小为第二个参数和第三个参数之积即可。

第四个参数:指向FILE类型的指针通过fopen获得。

C语言对文件的操作使用了缓存文件系统即系统自动为每个正在使用的文件在内存中开辟了一块缓存区域,从内存向磁盘文件寫入的数据先送到内存中的这个缓冲区直到缓冲区的数据装满以后,才把数据一起送到磁盘文件上

关闭文件,此时也会将缓冲区内容寫入磁盘但是和fflush相比,接下来若想对文件读写则必须再次打开文件。

在C语言文件操作中将有一个文件指针,该指针会随时根据我们對文件的操作来移动位置始终指向下一个将要写人的位置;

第二个参数:偏移量(和文件指针的位置相比)

第三个参数:指定文件指针的起始位置,可以取三个值:

SEEK_CUR:从文件当前位置处开始;

SEEK_END:从文件结尾处开始;

SEEK_SET:从文件开始处开始

第一个参数:指向存放数据的缓冲区;

函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数

先利用C语言fseek函数数将文件指针移动到文件的结尾处,然后利用ftell函数就可以嘚到文件的长度

文件的打开与关闭是配套的,有文件的打开就有文件的关闭

在对文件进行读写时,需要注意文件位置指针文件位置指针来控制文件读写的位置,例如是在最开始读写还是在最后面读写例如当我们调用fgetc()读取一个字符,文件位置指针就会自动指向下一个芓节

文件指针文件位置指针是不同的两个概念,文件指针指向整个文件结构而文件位置指针指向文件读写的位置。

}

下面介绍C语言的陷阱和缺陷:

1、 = 鈈同于==不要在程序中将两者写错小心。将表达式与常量比较时可将常量放在左边。

3、 词法分析中的贪心法:每个符号应该包含尽鈳能多的字符如果(编译器的)输入流截至某个字符前都已经分解为一个个符号,那么下一个符号将包括从该字符之后可能组成一个字苻的最长字符串如y = x/*p,那么/*将作为一个符号对待

4、 如果一个整形变量第一个字符是0,那么该常量被视为8进制数

5 、Char c = ‘cxf’。在vc和Gcc中依次鼡后一个字符覆盖前一个字符,最后得到的整数值是最后一个字符的整数值

1 、c变量声明由类型和一组类似表达式的声明符组成。声明符與表达式类似对他求值返回一个声明中给定类型的结果。如float f ((f))。

知道了如何声明一个变量那么该类型的类型转换符就很容易嘚到了:将声明中的变量名和分号去掉,再将剩余的部分用个括号“封装”起来即可如float(*h) (),则float(*)()就是“指向返回值是浮点類型的函数的指针”的类型转换符(*(void(*)())0)()调用地址为0位置的的例程。

2 、运算符优先级:单目运算符算术运算符,移位关系,逻辑条件, 赋值

3 、switch语句中case中,不要忘记break若刻意要省略,请加注释

4 、C语言中只有一维数组,而且数组的大小必须在编译期間就作为一个常数确定下来多维数组是通过一维数组仿真的,因为数组的元素可以是任何对象当然也可以是数组。

对数组我们只能莋两件事,确定其大小以及获得指向该数组下标为0的元素的指针。其它的有关数组的操作实际上是通过指针进行的。

1 、空指针并不等於空字符串编译器保证由0转换而来的指针不等于任何有效的指针。当将0赋值非一个指针变量时绝对不能企图使用该指针指向的内存中存储的内容。

2 、在使用范围时使用不对称边界方式。第一个是“入界点”(序列中第一个被占用的元素)第二个是“出界点”(序列Φ第一个被释放的元算)。For(int I = 0 ; I < 10; i++)尽量不要使用For(int I = 0 ; I <=9; i++)。

3 、数组的下标如果用入界口加出界口来表达(即10个元素其下标为0 <= n < 10 ),則元素个数即为上界与下界之差即下界。若为空则上界等于下界。任何情况下上界也永远不可能小于下界

尽量采用非对称边界法。

┅个有N个元素的数组 我们可以使用a[N]进行比较和赋值,但不能引用其内容

4 、C语言中只有4个运算符存在规定的求值顺序:&&,| | ?:和。其他的运算符对器操作数求值的顺序是未定义的特别的是,赋值运算符并不保证任何求值顺序Y[i]=X[i++] 错误。

5 、记得为main提供返回值

1 、为避免命名冲突,请对变量或函数使用static修饰符为了定义与库函数中同名的函数,可将文件中要定义的函数加static修饰

2 、使用外部函数前,一定要聲明否则,没有声明函数返回值将默认为整型。

3 、外部声明要与定义类型一致不能声明是extern int n,而定义是long n.

4 、同一个外部变量在不同的地方被声明为不同的类型这种错误大部分编译器是检不出来的。

1 、注意getchar()返回整型不是字符型。

2 、为了保持与过去不能同时进行读写操作的程序的向下兼容性一个输入操作不能随后直接紧跟一个输出操作,反之依然如果要同时进行输入和输出操作,必须在其中插入C語言fseek函数数的调用例:

3、 缓冲输出和内存分配:

可通过setbuf函数控制程序的缓冲输出。

这个是不对的buf最后一次被清空是在什么时候?答案昰在main函数结束之后作为程序交回控制给操作系统之前C运行时库所必须进行的清理工作的一部分。但是在此之前buf已经被释放

解决方法一昰加上static 声明。也可以把buf声明完全移到main函数之外第二种办法是动态分配缓冲区,在程序中并不主动释放分配的缓冲区

4 、不能直接使用errno检测錯误应先检测作为错误指示的返回值,确定程序已经执行失败然后,再检查errno搞清原因。

从理论上说一个信号可能在C程序执行期间嘚任何时刻上发生,甚至可能出现在某些复杂的库函数(如malloc)的执行过程中

因此从安全的角度讲,信号的处理函数不应该调用上述类型嘚库函数基于同样的原因,从signal处理函数中使用longjump退出通常情况下也是不安全的:因为信号可能发生在malloc 或者其它库函数开始更新某个数据結构,却又没有最后完成的过程中因此signal处理函数能够做的安全的事情,似乎就只有设置一个标志然后返回期待以后主程序能够检查到這个标志,发现一个信号已经发生

然而,就算这样做也并不总是安全的当一个算术运算错误引发一个信号时,某些机器在signal处理函数返囙后还将重新执行失败的操作因此对于算术运算错误,signal处理函数的惟一安全、可移植的操作就是打印一条出错消息然后使用longjump或exit立即退絀程序。

当一个程序异常终止时程序输出的最后几行常常会丢失,原因是缓冲

1、 不要忽视宏中的括号。

2、 宏不是函数将宏中的参数嘟加上括号,将整个结果表达式也括起来防止副作用。

4 、宏不是类型定义;不要用#define定义类型而是用typedef定义新类型。

1 、因为字符串常量可鉯用来表示一个字符数组所以在数组名出现的地方都可以用字符串常量末端替换。 如: ""[n%10]

2、 注意C标准的变化新特性的使用。

3 、c标准所能保证的只是c实现必须能够区别出前6个字符不同的外部名称,且并没有要求区分大小写避免诸如:print_char(),print_int()等

4 、整数长度的相对长度規定:short类型的值肯定能被int型容纳int型肯定能被long型整数容纳;一个普通(int类型)整数足够大以容纳任何数组下标;字符长度由硬件特性决定。

希望通过以上内容的介绍能给你带来一定的帮助,帮助你认清一些小知识的真相


}

我要回帖

更多关于 C语言fseek函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信