归纳 C 如何处理文件
文件 “stdio.h” 中定义了如下三个文件指针:
-stdin: 标准输入
-stdout: 标准输出
-stderr: 标准错误输出
它们对应的文件描述符分别是:0, 1, 2
其实 C++ Reference 对 stdio.h 的说明已经很详细了,但是输入输出并不是语言的部分,是操作系统的部分,下面会介绍这个特殊的部分。
freopen是用于文件重定向
dup和dup2是专门用于重定向的恢复
代码如下:(Linux 上可以运行)
#include <stdio.h>
#include <unistd.h> // linux 上用这个文件
// #include <io.h> // windows 上用这个文件
int main() {
int c;
char *filename= "out.txt";
int old_f;
FILE *f;
f = fopen(filename, "w");
fputs("hello world!\n\thello world!", f);
fclose(f);
old_f = dup(0); // 0 表示标准输入流的文件描述符
freopen(filename, "r", stdin); // stdin 表示标准输入的文件指针
while ((c = getchar()) != EOF) {
putchar(c);
}
fclose(stdin);
dup2(old_f, 0); // 恢复标准输入文件描述符
return 0;
}
fread和fwrite是专门针对块数据的
代码如下:(下面这个不能用不同的平台,原因是字节对齐的方式可能不一样)
#include <stdio.h>
#include <string.h>
struct OBJ {
int a;
double b;
char s[BUFSIZ];
int ar[10];
};
int main() {
char *filename = "out.txt";
FILE *f = NULL;
OBJ obj;
OBJ obj2;
memset(&obj, 0, sizeof(OBJ));
memset(&obj2, 0, sizeof(OBJ));
obj.a = 10;
obj.b = 20;
strcpy(obj.s, "hello world!");
obj.ar[5] = 5;
f = fopen(filename, "rw");
fwrite(&obj, sizeof(OBJ), 1, f);
rewind(f);
fread(&obj2, sizeof(OBJ), 1, f);
fclose(f);
printf("obj2.a = %d\n", obj2.a);
printf("obj2.b = %lf\n", obj2.b);
printf("obj2.s = %s\n", obj2.s);
printf("obj2.ar[5] = %d\n", obj2.ar[5]);
return 0;
}