• 文件操作(下)


    一. 文本文件和二进制文件

    根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
    数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
    如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文
    本文件。

    我们还是直接上代码

    #include 
    int main()
    {
     int a = 10000;
     FILE* pf = fopen("test.txt", "wb");
     fwrite(&a, 4, 1, pf);//二进制的形式写到文件中
     fclose(pf);
     pf = NULL;
     return 0; }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    我们可以发现 以txt格式打印出来之后是一堆乱码

    我们再用二进制形式打开这个文件

    在这里插入图片描述
    我们可以发现 它可以转换成 0x 00 00 27 10格式

    二. 文件读取结束的判定

    这里提供三种文件读取的结束标志

    fgetc判断是否为 EOF

    fgets 判断返回值是否为null

    二进制文件fread 判断返回值是否小于要读的个数

    这里给出二进制的判断代码 如果返回值不等于返回值 则表示读取失败

    enum { SIZE = 5 };
    int main(void) {
        double a[SIZE] = {1.,2.,3.,4.,5.};
        FILE *fp = fopen("test.bin", "wb"); // 必须用二进制模式
        fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组
        fclose(fp);
        double b[SIZE];
        fp = fopen("test.bin","rb");
        size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 读 double 的数组
        if(ret_code == SIZE) {
            puts("Array read successfully, contents: ");
            for(int n = 0; n < SIZE; ++n) printf("%f ", b[n]);
            putchar('\n');
       } else { // error handling
           if (feof(fp))
              printf("Error reading test.bin: unexpected end of file\n");
           else if (ferror(fp)) {
               perror("Error reading test.bin");
           }
       }
        fclose(fp);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    三. 文件缓冲区

    这里我们先给定义

    ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序
    中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装
    满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓
    冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根
    据C编译系统决定的。

    int main()
    {
    	FILE* pf = fopen("test.txt", "w");
    	fputs("abcdef", pf);//先将代码放在输出缓冲区
    	printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");
    	Sleep(10000);
    	printf("刷新缓冲区\n");
    	fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)
    	//注:fflush 在高版本的VS上不能使用了
    	printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");
    	Sleep(10000);
    	fclose(pf);
    	//注:fclose在关闭文件的时候,也会刷新缓冲区
    	pf = NULL;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    我们先将test.txt的所有内容清空

    然后我们输入

    fputs("abcdef", pf);//先将代码放在输出缓冲区
    
    • 1

    我们打开文件 发现文件并没有被改变

    	fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)
    
    • 1

    只有再执行这段代码之后 刷新文件缓冲区

    之后文件就会有内容了

    所以说我们这里能够得到一个结论!

    **
    因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文
    件。
    如果不做,可能导致读写文件的问题。**

    以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够

    不吝赐教 在评论区或者私信指正 博主一定及时修正

    那么大家下期再见咯

  • 相关阅读:
    MyBatis 面试题
    JS+canvas+pdfjs实现图片或pdf高亮
    DHTMLX JavaScript Gantt Chart 8.0.5 Crack
    客户端单元测试实践 — C++篇
    十二、集合(4)
    网络安全-Web端安全协议
    List接口与实现类
    【Vue项目复习笔记】将商品添加到购物车
    FL Studio21.1.0水果中文官方网站
    【算法|前缀和系列No.3】leetcode LCR 012. 寻找数组的中心下标
  • 原文地址:https://blog.csdn.net/meihaoshy/article/details/127131257