打开与关闭文件指针
要使用标准I/O库的第一步就是获得文件描述结构FILE*。前两个函数分别根据文件路径和文件描述符打开文件。第三个函数将会根据文件路径打开文件并将其与第三个参数绑定在一起。如果第三个参数之前有关联文件,该文件将被关闭(close)。这个函数的作用有点像dup2,可以将stdin/stdout/stderr关联到指定文件。
以上模式均可以搭配一个“+”(例如r+, w+, a+)。作用是增加读或写权限。例如r+相比于r增加了写权限,w+相比于w增加了读权限。 对于w,w+,a,a+模式,当文件不存在时将被自动创建。
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);
关闭文件相对简单,只有一个函数。
int fclose(FILE *fp);
打开模式
在上面的函数中有一个mode参数。该参数决定了文件是否以读(r)、写(w)、追加(a)方式打开。在追加方式(append)下所有的数据将写在文件末尾,类似于open()函数的O_APPEND参数。 该方式主要用于多个进程/线程写同一文件。以上模式均可以搭配一个“+”(例如r+, w+, a+)。作用是增加读或写权限。例如r+相比于r增加了写权限,w+相比于w增加了读权限。 对于w,w+,a,a+模式,当文件不存在时将被自动创建。
错误处理
对于一个健壮的程序,好的错误处理时必不可少的。尝试获取文件指针后应当检查是否成功并尽可能打印错误信息。当错误发生时errno将会设置,因此可以使用下面的程序段打印错误信息。
if (!fp) {
perror(NULL);
}
文件缓冲
下图简单描述了标准I/O的函数调用结构。对于每一个文件指针,标准I/O分别包含一个写缓冲和一个读缓冲。当用户程序调用fscanf()或fprintf()读写文件时,数据会先储存在缓冲或从缓冲读取数据。标准I/O支持三种不同的缓冲方式:
1. 无缓冲(unbuffered)。所有的读写操作将直接导致系统调用read/write。
2. 行缓冲(line buffered)。写数据将先存储在写缓冲中直到遇到newline字符或者缓冲满,再调用write。一个特别情况是:
当用户程序调用读函数