进击吧,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所属头文件
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所属头文件
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所属头文件
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所属头文件
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所属头文件
3.5.5返回值
成功:0
失败:-1
3.5.6参数说明
stream:文件指针
offset:从whence设置的地方开始移动,正数往后移,负数往前移
whence:
-SEEK_SET:从文件开头开始移动
-SEEK_CUR:从当前位置开始移动
-SEEK_END:从文件末尾开始移动
3.5.7示例代码
写入的效果就是
重定位文件位置后,再写入数据就将之前写入的数据给覆盖掉了。
这样,也就搞定了库函数的文件操作。可见库函数的文件操作和系统调用的文件操作有区别的。
区别一:
库函数的文件操作以写方式打开,会将源文件的内容给清空掉
区别二:
库函数的文件读取和写入,数据个数参数设置要多一些,这样,写入和读取的方式就丰富了,会方便某些复杂类型的文件操作使用。