流的打开与关闭

如果需要对文件进行读写操作,首先应该得到一个流指针,或者说首先应该将文件打开。
#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用来指定打开文件的方式。注意此方式表示的是进程(或执行程序)对文件的操作权限,而非用户对文件的执行权限。表2.1说明了mode的各种取值。
表2.1 mode取值说明
mode 功能
r或rb 以只读的方式打开文件,文件必须存在
r+或r+b 以读写的方式打开文件,文件必须存在
w或wb 以只写的方式打开文件,如果文件不存在,则自动创建;如果文件存在,则截取文件的长度为0,即清空文件中的数据
w+或w+b 以读写的方式打开文件,如果文件不存在,则自动创建;如果文件存在,
则截取文件的长度为0,即清空文件中的数据
a或ab 以只写的方式打开文件,如果文件不存在,则自动创建;如果文件存在,
则追加到文件的末尾,即原有数据不清空,在数据末尾继续写入
a+或a+b 以读写的方式打开文件,如果文件不存在,则自动创建;如果文件存在,则追加到文件的末尾,即原有数据不清空,在数据末尾继续写入或读取
注意,在每一个选项中加入b字符用来告诉函数库打开的文件为二进制文件,而非纯文本文件。不过在Linux系统中会忽略该符号。
当用户程序运行时,系统会自动打开3个流指针,它们分别是:标准输入流指针stdin、标准输出流指针stdout和标准错误输出流指针stderr。这3个流指针无需声明,可以直接被进程所使用,如表2.2所示。
表2.2 系统预定义流指针
标准输入 0 STDIN_FILENO stdin
标准输出 1 STDOUT_FILENO stdout
标准错误输出 2 STDERR_FILENO stderr
stdin用来从标准输入设备(默认是键盘)中读取输入内容;stdout用来向标准输出设备(默认是当前终端)输出内容;stderr用来向标准错误设备(默认是当前终端)输出错误信息。这3个流指针由于是系统预定义,因此可以用来直接使用,它们经常被用来实现终端上的输入输出。其本质与fopen的返回值FILE
的指针一样。它们一个需要程序自己定义,一个是系统定义。所关联的对象有所不同,系统预定义的3个流指针所关联的对象可以认为是终端,而fopen的返回值FILE
的指针所关联的对象是打开的文件。关于其使用的情景,在后续章节着重介绍。
关闭流的函数为fclose()。该函数将流的缓存区内的数据全部写入文件中,并释放相关资源。有时函数也可以被忽略,因为程序结束时会自动关闭所有打开的流指针。

#include <stdio.h>
 int fclose(FILE *fp);

其中fp为已打开的流指针。具体如例2-1所示。

  1 #include <stdio.h>
  2 
  3 int main(int argc, const char *argv[])
  4 {
  5     FILE *fp;
  6     if((fp = fopen("test.txt", "w")) == NULL){
  7         printf("fopen error\n");
  8         return -1;
  9     }
 10     fclose(fp);
 11     return 0;
 12 }    

运行之后,如果文件不存在,则会在当前工作目录下,自动创建一个test.txt文件;如果文件存在,则test.txt文件中的数据被清空。也可将fopen()函数的mode参数换成其他试验。

猜你喜欢

转载自blog.csdn.net/anton_99/article/details/99230171