文本文件和二进制文件的处理
- 标准输入
- 标准输出
- 程序控制
文件
- 文本文件,即在外存上的已命名的字符集合
- 自动在最后加一个特殊字符,即文件结束符,标记为EOF
- 不妨表示为
<eof>
- 不妨表示为
- 按下return or enter键时,会在文件中放置一个换行符
\n
- 自动在最后加一个特殊字符,即文件结束符,标记为EOF
This is a text file<newline>
It has two lines.<newline><eof>
- 每一行都以
<newline>
为结束 - 每一个文件都以
<eof>
为结束 - 而在磁盘中,它是连续的存储空间占用,如下
This is a text file<newline>It has two lines.<newline><eof>
- 即文本输入流,是字符代码的连续流,只不过有些代码表示换行或是结束
- 流可用于输入【来自键盘】
- 可用于输出【给到屏幕,或是打印机,或是文件】
- 可用于文件读写
- input stream
- output stream
键盘和屏幕作用为文本流
- 交互编程
- 用户有输入,从键盘输入
- stdin
- 系统有输出,输出到屏幕上
- stdout
- 如果出错,也显示到屏幕上
- stderr
- 用户有输入,从键盘输入
- 这些都是文本流,即都是由一个个字符构成的,纯字符
- 在交互编程时,使用一个标记值指示数据输入的结束,而不是放置
eof
,不过eof
也可以使用- 单个键不能代表
eof
- 使用
ctrl+D
可以在unix上表示eof
- 使用
ctrl+Z
可以在windows上表示eof
- 单个键不能代表
换行与EOF
<newline>
标记一行文本的结束<eof>
标记整个文件的结束
// 循环处理输入
// 但这里没有检测:输入成功与否,只是循环的条件是出现EOF才退出,否则一直做“输入”和“处理”
int status;
int num;
for (status = scanf("%d", &num); status != EOF; status = scanf("%d", &num))
{
process(num); // 处理
}
文件指针变量
-
库:stdio.h
-
函数:fopen()可以准备好fp
-
字符串表示文件名
-
字符串表示打开模式
- 只读
- 只写
- 读写
- 追加
-
-
如果用"w"模式打开一个文件,之前这个文件如果已经存在,则通常会引起文件内容的丢失
-
也就是说,打开一个文件时,OS会自动为文件版本编号,并产生一个新版本,那么文件的内容就不会丢失,这时,就要用“a”模式打开
#include <stdio.h>
#define STASIZ 80
int main(void)
{
char inName[STRSIZ], outName[STRSIZ];
FILE *inp, *outp;
char ch;
printf("Enter name of file you wanna backup > ");
// 打开读文件:直到打开文件成功,注意for循环的ABCD四个部分,打开成功,才会退出for循环
for(scanf("%s",inName); // A
(inp = fopen("inName","r"))==NULL; // B
scanf("%s",inName)) // C
{
// D
printf("Connot open %s for input\n",inName);
printf("Re-enter file name > ");
}
// 打开写文件:直到打开文件成功
for(scanf("%s",outName);
(inp = fopen("outName","w"))==NULL;
scanf("%s",outName))
{
printf("Connot open %s for input\n",outName);
printf("Re-enter file name > ");
}
// 实现逐个字符读写
for( ch = getc(inp); ch != EOF; ch = getc(inp)) // 一直读到文件尾
{
putc(ch,outp); // 输出到文件
}
// 关闭文件
fclose(inp);
fclose(outp);
printf("Copied %s to %s.\n", inName, outName);
return 0;
}
图示
二进制文件
- 输入文本时,人按键,以为是输入了对应的符号,但本质上是,ASCII键值,对应到机器中是二进制编码;
- 当文本文件存储时,程序要用资源来将文本字符流转为二进制,这才是它在内存中的存在形式;
- 当读取时,程序要用资源来将二进制再转为文本字符流,这是人可以读懂的显示形式;
- 而scanf和printf就是来完成这些功能的
- 字符,数字,符号
- 整数
- 浮点数
- 尾数
- 指数
- 为避免不必要的转来转去,可以直接使用二进制进行存取文件操作
更高效率的文件操作
- 直接通过程序产生二进制文件
- 再直接将文件中的各个数据项的计算机内部表示形式存储在文件中
FILE *bfp;
int i;
// 打开文件
bfp = fopen("nums.bin","wb");
// 写文件:将500内的偶数存入
for(i=0;i<=500;i+=2)
{
fwrite(&i, sizeof(int), 1, bfp);// 块方式,一次写一个整数[的存储空间大小],即4个字节
}
// 关闭文件
fclose(bfp);
二进制的优缺点
- 优点:
- 高效
- 在操作double时,不用担心在文本操作时转化为字符串时精度上的丢失
- 二进制无格式,操作统一
- 缺点:
- 在一台计算机上产生的二进制文件,在另一种型号的计算机上,几乎无法读取!!!
- 所以xml和JSON大行其道啊