为了提供比底层系统调用更为方便、 简洁、 且可移植性更好的调用接口, 于是就出现了 C语言函数库。 在本章节中将会对基本的文件操作库函数进行学习。
1、FILE指针
FILE 指针的作用相当于文件 IO 中的文件描述符, 对于标准 I/O 库函数来说, 它们的操作是围绕 FILE 指针进行的, 当使用标准 I/O 库函数打开或创建一个文件时, 会返回一个指向FILE 类型对象的指针(FILE *), 使用该 FILE 指针与被打开或创建的文件相关联, 然后该FILE 指针就会被用于后续的标准 I/O 操作(使用标准 I/O 库函数进行 I/O 操作)。 FILE 数据结构定义在标准 I/O 库函数头文件 stdio.h 中。
2、fopen
头文件和函数原型:
#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);
pathname:字符串类型,打开或创建的文件路径和文件名
mode:字符串类型,用于指定文件的打开方式,如:
返回值:返回NULL异常
例:
3、fclose
头文件和函数原型:
#include <unistd.h>
int close((FILE *stream);
stream:FILE 指针
返回值:成功返回0。失败返回-1,并会设置errno来指示错误原因
4、fread
头文件和函数原型:
#include <stdio.h> size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr:存放读到的数据缓存区
size:从文件读取 nmemb 个数据项, 每一个数据项的大小为 size 个字节, 所以总共读取的数据大小为 nmemb * size 个字节
nmemb:指定了读取数据项的个数
stream:FILE 指针
返回值:调用成功时返回读取到的数据项的数目(数据项数目并不等于实际读取的字节数, 除非参数 size 等于 1); 如果发生错误或到达文件末尾, 则 fread()返回的值将小于参数 nmemb, 那么到底发生了错误还是到达了文件末尾, fread()不能区分文件结尾和错误, 究竟是哪一种情况,此时可以使用 ferror()或 feof()函数来判断。
例:
5、fwrite
头文件和函数原型:
#include <stdio.h>
size t fwrite(void *ptr, size t size, size t nmemb, FILE *stream);
ptr:存放读到的数据缓存区
size:从文件写入 nmemb 个数据项, 每一个数据项的大小为 size 个字节, 所以总共写入的数据大小为 nmemb * size 个字节
nmemb:指定了写入数据项的个数
stream:FILE 指针
返回值:调用成功时返回写入的数据项的数目(数据项数目并不等于实际写入的字节数, 除非参数size 等于 1); 如果发生错误, 则 fwrite()返回的值将小于参数 nmemb(或者等于 0)。
由此可知, 库函数 fread()、 fwrite()中指定读取或写入数据大小的方式与系统调用 read()、 write()不同, 前者通过 nmemb(数据项个数) *size(每个数据项的大小) 的方式来指定数据大小,而后者则直接通过一个 size 参数指定数据大小。
例:
6、fseek(用于设置文件读写位置偏移量)
头文件和函数原型:
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
stream:FILE 指针
offset:偏移量,字节单位,可以正负。负数表示向前移动,整数表示向后移动。
whence:当前位置的基点,可以使用以下三组值:
SEEK_SET: 相对于文件开头
SEEK_CUR:相对于当前的文件读写指针位置
SEEK_END:相对于文件末尾
返回值:成功返回当前位移大小,失败返回-1。
例:
7、feof(用于fread出错原因)
头文件和函数原型:
#include <stdio.h> int feof(FILE *stream);
stream:FILE 指针
返回值:如果 end-of-file (文件末尾)标志被设置了, 则调用 feof()函数将返回一个非零值, 如果 end-of-file 标志没有被设置, 则返回 0。 当文件的读写位置移动到了文件末尾时, end-of-file 标志将会被设置。
例:
8、ferror(测试参数 stream 所指文件的错误标志)
头文件和函数原型:
#include <stdio.h>
int ferror(FILE *stream);
stream:FILE 指针
返回值:如果错误标志被设置了则返回 1, 否则返回 0。
9、clearerr
当调用 feof()或 ferror()校验这些标志后, 通常需要清除这些标志, 避免下次校验时使用到的是上一次设置的值, 此时可以手动调用 clearerr()函数清除标志。
头文件和函数原型:
#include <stdio.h>
void clearerr(FILE *stream);
stream:FILE 指针