20201207-C语言-文本文件和二进制文件的处理

文本文件和二进制文件的处理

  • 标准输入
  • 标准输出
  • 程序控制

文件

  • 文本文件,即在外存上的已命名的字符集合
    • 自动在最后加一个特殊字符,即文件结束符,标记为EOF
      • 不妨表示为<eof>
    • 按下return or enter键时,会在文件中放置一个换行符 \n
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大行其道啊

猜你喜欢

转载自blog.csdn.net/matrixbbs/article/details/110800985