进击吧,linux(九) 库函数学习之文件操作
0赞
之前学习的文件操作是系统调用的函数,系统调用的函数是由操作系统的内核实现的。而基于C实现的函数库和具体的操作系统是没有关系的,不管是在什么操作系统上,都是可以使用的。因此,使用库函数进行程序设计可提高程序的移植性。
同样,还是来学习文件操作。库函数的文件操作和系统调用的文件操作也差不多,不过还是有一些区别。
对于库函数来说,文件被当成流来对待,而且是使用FILE来定义文件指针,这个和系统调用的文件使用就不一样了。
在《unix环境高级编程》第五章,有对库函数文件操作的说明。
当然,总体操作来说,有几个:
1、 打开文件
2、 读文件内容
3、 写文件内容
4、 重定位文件指针
5、 关闭文件
然后和上次一样,按照模板,加上linux的man命令,依次的学习。
一、打开文件
使用的是fopen。要注意的是打开文件的模式。在以写模式打开文件的时候,会将源文件的内容给清空的,这里要注意。
3.1.1 函数名
fopen
3.1.2 函数原形
FILE *fopen(const char *path, const char *mode)
3.1.3 函数功能
打开文件
3.1.4 所属头文件
<stdio.h>
3.1.5 返回值
成功: 文件指针
失败:NULL指针
3.1.6 参数说明
path : 文件名(含路径)
mode: 打开文件模式
-r: 只读
-r+: 可读可写
-w: 写,如果文件存在,将文件清空。文件不存在就创建。
-w+: 可读可写,如果文件存在,将文件清空。文件不存在就创建。
-a: 追加,只写。
-a+: 追加,读位置为文件开始处,写位置是文件末尾
3.1.7 示例代码
打开一个文件,可读可写。不存在就创建,存在的话就将文件内容清零。
二、关闭文件
3.2.1 函数名
fclose
3.2.2 函数原形
int fclose(FILE *fp)
3.2.3 函数功能
文件关闭
3.2.4 所属头文件
<stdio.h>
3.2.5 返回值
成功:0
失败:EOF(这是一个宏)
3.2.6 参数说明
fp : 文件指针
3.2.7 示例代码
三、读文件
这里使用读的操作和系统调用的读操作就有不一样的地方了。读有4个参数,其中由两个参数决定读取多少个数据。可以进行块的读取。这样的话,在读一些复杂的类型的时候,就很方便了。
3.3.1 函数名
fread
3.3.2 函数原形
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
3.3.3 函数功能
从指定的文件中,读取nmemb块个数据,每个块的大小是size个字节,到ptr指向的空间中。
3.3.4 所属头文件
<stdio.h>
3.3.5 返回值
成功: 成功读取到的数据
失败: 0
3.3.6 参数说明
ptr: 读取数据保存的空间的首地址
size: 每一块的大小
nmemb: 读取的数据块数
stream: 文件指针
3.3.7 示例代码
这里,要注意,不能以w或者w+方式打开文件,不然会将源文件的内容给清掉的,这样,就读不出数据了。
四、写文件
这个也和系统调用的写不一样了,有4个参数,其中有两个参数决定写入数据的个数。可以进行块数据写入。这样,对于复杂的数据类型,写入就很方便了。
3.4.1 函数名
fwrite
3.4.2 函数原形
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
3.4.3 函数功能
向指定的文件中,写入nmemb块数据,每一块的大小是size字节,写的数据在ptr执行的空间中
3.4.4 所属头文件
<stdio.h>
3.4.5 返回值
成功: 成功写入的数据
失败: 0
3.4.6 参数说明
ptr: 写入文件的数据
size: 每一块的大小
nmemb: 写入的数据块数
stream: 文件指针
3.4.7 示例代码
五、文件位置重定位
对于文件,有一个文件位置指针。在打开文件的时候,指向文件开头,随着对文件进行读写,该位置会随时变化。我们可以改变这个位置。
3.5.1 函数名
fseek
3.5.2 函数原形
int fseek(FILE *stream, long offset, int whence)
3.5.3 函数功能
重定义文件位置指针
3.5.4 所属头文件
<stdio.h>
3.5.5 返回值
成功:0
失败:-1
3.5.6 参数说明
stream: 文件指针
offset:从whence设置的地方开始移动,正数往后移,负数往前移
whence:
-SEEK_SET: 从文件开头开始移动
-SEEK_CUR:从当前位置开始移动
-SEEK_END:从文件末尾开始移动
3.5.7 示例代码
写入的效果就是
重定位文件位置后,再写入数据就将之前写入的数据给覆盖掉了。
这样,也就搞定了库函数的文件操作。可见库函数的文件操作和系统调用的文件操作有区别的。
区别一:
库函数的文件操作以写方式打开,会将源文件的内容给清空掉
区别二:
库函数的文件读取和写入,数据个数参数设置要多一些,这样,写入和读取的方式就丰富了,会方便某些复杂类型的文件操作使用。