weiqi7777

进击吧,linux(九) 库函数学习之文件操作

0
阅读(2241)

 

           之前学习的文件操作是系统调用的函数,系统调用的函数是由操作系统的内核实现的。而基于C实现的函数库和具体的操作系统是没有关系的,不管是在什么操作系统上,都是可以使用的。因此,使用库函数进行程序设计可提高程序的移植性。

           同样,还是来学习文件操作。库函数的文件操作和系统调用的文件操作也差不多,不过还是有一些区别。

           对于库函数来说,文件被当成流来对待,而且是使用FILE来定义文件指针,这个和系统调用的文件使用就不一样了。

           在《unix环境高级编程》第五章,有对库函数文件操作的说明。

clip_image001

           当然,总体操作来说,有几个:

1、      打开文件

2、  读文件内容

3、  写文件内容

4、  重定位文件指针

5、  关闭文件

然后和上次一样,按照模板,加上linuxman命令,依次的学习。

一、打开文件

使用的是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 示例代码

clip_image003

           打开一个文件,可读可写。不存在就创建,存在的话就将文件内容清零。

二、关闭文件

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 示例代码

clip_image005

三、读文件

这里使用读的操作和系统调用的读操作就有不一样的地方了。读有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 示例代码

    clip_image007

    这里,要注意,不能以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 示例代码

  clip_image009

五、文件位置重定位

对于文件,有一个文件位置指针。在打开文件的时候,指向文件开头,随着对文件进行读写,该位置会随时变化。我们可以改变这个位置。

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 示例代码

     clip_image011

写入的效果就是

clip_image012

重定位文件位置后,再写入数据就将之前写入的数据给覆盖掉了。

这样,也就搞定了库函数的文件操作。可见库函数的文件操作和系统调用的文件操作有区别的。

区别一:

   库函数的文件操作以写方式打开,会将源文件的内容给清空掉

区别二:

   库函数的文件读取和写入,数据个数参数设置要多一些,这样,写入和读取的方式就丰富了,会方便某些复杂类型的文件操作使用。