如果需要对文件进行读写操作,首先应该得到一个流指针,或者说首先应该将文件打开。
#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);点击复制复制失败已复制
使用标准I/O打开文件的函数有 fopen()
、 fdopen()
、 freopen()
。他们可以以不同的模式打开文件,都返回一个指向 FILE
的指针, FILE
结构体与 path
相关联( FILE
结构体描述 path
)。此后,对文件的读写通过这个 FILE
指针来进行。其中, fopen()
函数可以指定打开文件的路径和模式; fdopen()
函数可以指定打开的文件描述符和模式;而 freopen()
函数除可指定打开的文件和模式外,还可指定特定的 I/O流
。
其中,参数 mode
用来指定打开文件的方式。注意此方式表示的是进程(或执行程序)对文件的操作权限,而非用户对文件的执行权限。
mode | 功能 |
r 或 rb |
以只读的方式打开文件,文件必须存在 |
r+ 或 r+b |
以读写的方式打开文件,文件必须存在 |
w 或 wb |
以只写的方式打开文件。如果文件不存在,则自动创建;如果文件存在,则截取文件的长度为 0 ,即清空文件中的数据 |
w+ 或 w+b |
以读写的方式打开文件。如果文件不存在,则自动创建;如果文件存在,则截取文件的长度为 0 ,即清空文件中的数据 |
a 或 ab |
以只写的方式打开文件。如果文件不存在,则自动创建;如果文件存在,则追加到文件的末尾,即原有数据不清空,在数据末尾继续写入 |
a+ 或 a+b |
以读写的方式打开文件。如果文件不存在,则自动创建;如果文件存在,则追加到文件的末尾,即原有数据不清空,在数据末尾继续写入,但在数据开头读取 |
注意
在每一个选项中加入 b
字符用来告诉函数库打开的文件为二进制文件,而非纯文本文件。不过在 Linux
系统中会忽略该符号。
stdin、stdout和stderr
当用户程序运行时,系统会自动打开 3
个流指针,他们分别是:标准输入流指针stdin
、标准输出流指针stdout
和标准错误输出流指针stderr
。这三个流指针无须声明,可以直接被进程所使用,如下所示:
用途 | 对应文件描述符 | 宏定义 | 标准流指针 |
标准输入 | 0 | STDIN_FILENO | stdin |
标准输出 | 1 | STFOUT_FILENO | stdout |
标准错误输出 | 2 | STDERR_FILENO | stderr |
stdin
用来从标准输入设备(默认是键盘)中读取输入内容; stdout
用来向标准输出设备(默认是当前终端)输出内容; stderr
用来向标准输出设备(默认是当前终端)输出错误信息。这3个流指针由于是系统预定义的,因此可以直接使用,他们经常被用来实现终端上的输入/输出,其本质与 fopen
的返回值 FILE*
的指针一样。所关联的对象有所不同,系统预定义的3个流指针所关联的对象可以认为是终端,而 fopen
的返回值 FILE*
的指针所关联的对象是打开的文件。
关闭流
关闭流的函数为 fclose()
。该函数将流的缓存区内的数据全部写入文件,并释放相关资源。有时函数也可以被忽略,因为程序结束时会自动关闭所有打开的流指针。
#include <stdio.h> int fclose(FILE *fp);点击复制复制失败已复制
其中, fp
为已打开的流指针。
示例
#include <stdio.h> int main(int argc, const char *argv[]) { FILE *fp; if ((fp = fopen("test.txt", "w")) == NULL) { printf("fopen error\n"); return -1; } fclose(fp); return 0; }点击复制复制失败已复制
运行之后,如果文件不存在,则会在当前工作目录下,自动创建一个 test.txt
文件;如果文件存在,则 test.txt
文件中的数据被清空。也可以改变 fopen()
函数的 mode
函数进行试验。