目录
- 标准库IO函数
- 一、fopen
- 二、fwrite
- 三、fread
- 四、fseek
- 五、fclose
在编写程序时,离不开IO操作,最常见的IO操作就是用printf函数进行打印,本文主要介绍的是封装后的IO库函数。
标准库IO函数
常使用的IO库函数如下:
函数 | 作用 |
---|---|
fopen | 打开指定的文件 |
fwrite | 向指定的文件写入数据 |
fread | 从指定的文件读取数据 |
fseek | 跳转到指定文件的读写位置 |
fclose | 关闭指定文件 |
一、fopen
FILE *fopen(const char *path, const char *mode);
作用:用指定的方式打开指定的文件
- const char *path:文件名(要带这个文件的路径)
- const char *mode:文件的打开方式(只读、追加写等方式)
返回值:成功返回FILE*文件流指针,通过这个指针来操作文件,失败返回NULL。
文件打开方式 mode:
- r:只读,文件必须存在,否则打开失败
- r+:可读可写,文件必须存在,否则打开失败
- w:只写,文件不存在会创建文件并打开,文件存在则会清空文件的原有内容并打开文件
- w+:可读可写,文件不存在会创建文件并打开,文件存在则会清空文件的原有内容并打开文件
- a:追加只写,文件不存在会创建文件并打开,文件存在则直接打开,写入数据时把数据写入到文件末尾
- a+:可读追加写,文件不存在会创建文件并打开,文件存在则直接打开,写入数据时把数据写入到文件末尾
- b:以二进制方式打开文件,否则默认以文本形式打开文件
以上这些方式都是可以组合的,比如可以使用二进制打开并且可读追加写:ba+
二、fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
作用:通过传递的文件流指针,向文件写入指定大小的数据。
- const void *ptr:要向文件写入的数据的首地址
- size_t size:要向文件写入数据的块大小。因为文件的写入和读取是以块为单位的,块大小就是把数据均分成几块,每块文件有多大。
- size_t nmemb:要向文件写入数据的块的个数。
- FILE *stream:文件流指针,表示要把数据写入到哪个文件
返回值:返回实际写入文件的完整块的个数(1.5个块就返回1,0.5就返回0),出错返回0。
三、fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
作用:从指定的文件读取指定大小的数据。
- void *ptr:用来存储读取到的数据的空间的首地址。
- size_t size:要读取的块的大小。
- size_t nmemb:要读取的块的个数。
- FILE *stream:要操作的文件的文件流指针。
返回值:成功返回实际读取到的完整块的个数,读取不足一块的返回0,读取到了文件末尾返回0,出错了返回0。因此返回值是有歧义的。
因为返回值有歧义,因此通常把nmenb设置为要读取的数据的长度,把块的大小设置成1,这种方式可以明确通过返回值判断,到底有没有读取到数据。还可以使用下面两个函数来帮助判断返回值的含义。
-
int ferror(FILE* stream):
- 作用:测试文件的上一次操作是否出错了,出错了返回1
-
int feof(FILE*stream):
- 作用:测试文件读写是否到达文件末尾,到达文件末尾返回1
四、fseek
int fseek(FILE *stream, long offset, int whence);
作用:跳转文件的读写位置。
- FILE *stream:要操作的文件流指针
- long offset:偏移量(负数表示向前偏移,整数表示向后偏移,0不偏移)
- int whence:表示从哪里开始偏移
返回值:成功返回0,失败返回-1
什么是读写位置,为什么要跳转?
如果往一个文件写数据,写完之后直接读取,你会发现什么也读不出来。因为文件有一个读写位置,你可以理解成一个指针,这个指针指向的是你文件操作的最末端,你从最末端读取自然读取不出来,因此读取前要把指针指向文件的开头,也就是把读写位置跳转到开头。
whence选项:
- SEEK_SET:起始位置
- SEEK_CUR:当前读写位置
- SEEK_END:末尾位置
注意:如果你想在追加写的时候跳转读写位置,比如说,想在文件的开头进行追加写,这样是不会成功的,因为追加写只会在文件末尾进行写入。
文件的写入是一种覆盖式写入,比如我将读写位置跳转到w字符处,然后写入123,这样wor三个字符会被覆盖。
五、fclose
int fclose(FILE *stream);
作用:关闭文件
- FILE *stream:要关闭的文件的文件流指针
返回值:成功返回0,失败返回-1