1. 文件类型FILE及其指针FILE *
C语言程序把输入和输出看作是字节流,对于面向文本的程序,每个字节代表一个字符。文件类型type FILE
对象包含控制流的信息1:指向缓存的指针、位置指示器(缓存中当前字符位置)和状态指示器(是否正在读或写文件、是否出现错误或EOF
等等)。包括头文件<cstdio>
或<stdio.h>
后,自动创建三个文件类型FILE
的对象,相应指针FILE *
分别是stdin
(标准输入流standard input stream)、stdout
(标准输出流standard output stream)和stderr
(标准错误流standard error stream),都是常量constant,无法直接赋值。通常,stdin
与键盘相连,stdout
和stderr
与屏幕相连,但是也可以把它们重定向到文件或者管道(见下文重定向标准输入和输出流)。
FILE * fopen (const char * filename, const char * mode);
FILE * freopen (const char * filename, const char * mode, FILE * stream);
int fclose (FILE * stream);
除了程序开始时自动创建的三个文件类型对象,也可以使用头文件<cstdio>
中的fopen
函数创建需要的文件类型对象。根据fopen
函数原型,其第一个参数是文件名,第二个参数是文件访问模式,返回值是一个指向文件类型对象的指针(空指针NULL
代表打开失败)。
C string | 模式 |
---|---|
“r” | 读 |
“w” | 写 |
“a” | 附加 |
“r+” | 读和更新 |
“w+” | 写和更新 |
“a+” | 附加和更新 |
fopen
函数按照文件访问模式打开文件,并将该文件与一个流联系起来。在未来的操作中,该流可以通过返回的文件类型指针来辨认。流充当着程序端与文件端之间的媒介,连接二者。文件端可以是文件,也可以是装置,比如键盘和屏幕。相应地,可以通过fclose
函数关闭与传入文件类型指针相关联的文件,并将流与文件和所有相关联的缓存分离,清空所有缓存。分离后,该流FILE *
还可以通过freopen
函数重新被使用去打开(其他)文件或者改变文件访问模式。代码示例如下:
#include <stdio.h>
int main(int argc, char const *argv[]) {
FILE * pfile = fopen("1.txt", "r"); // open file 1.txt
if (pfile != NULL) {
printf("fopen succeeded.\n");
} else {
printf("fopen failed.\n");
}
int n = 13;
char a[n];
fgets(a, n, pfile); // read n-1 characters from pfile stream
// 1.txt only contains one line: hello, world\n
printf("%s\n", a);
fclose(pfile); // close file 1.txt
freopen("1.txt", "a", stdout)