文件操作(下)

简介: 文件操作(下)

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


根据数据的组织形式,数据文件被称为文本文件或者二进制文件。

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文

本文件。


我们还是直接上代码


#include <stdio.h>
int main()
{
 int a = 10000;
 FILE* pf = fopen("test.txt", "wb");
 fwrite(&a, 4, 1, pf);//二进制的形式写到文件中
 fclose(pf);
 pf = NULL;
 return 0; }


6cd72547ac4446d5b09c784e53b0827a.png

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


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


4cda0aa82da24c6db5ff317e9bd12147.png


我们可以发现 它可以转换成 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);
}


三. 文件缓冲区


这里我们先给定义


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;
}


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


然后我们输入


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


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


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


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


之后文件就会有内容了


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


**

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文

件。

如果不做,可能导致读写文件的问题。**


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


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


那么大家下期再见咯

相关文章
|
人工智能 小程序 前端开发
uniapp框架——初始化vue3项目(搭建ai项目第一步)
uniapp框架——初始化vue3项目(搭建ai项目第一步)
392 1
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习在自然语言处理中的突破与未来趋势####
本文深入探讨了深度学习技术在自然语言处理(NLP)领域的最新进展,重点介绍了其在语言理解、生成及翻译等方面的革新应用。通过对比传统方法的局限性,展示了深度学习如何以其强大的特征提取和学习能力重塑NLP领域。文章还分析了当前面临的挑战,如模型泛化能力、解释性问题及资源消耗等,并展望了未来发展趋势,包括多模态学习、持续学习机制以及更加公平和可解释的AI模型设计。本文旨在为读者提供一个全面而深入的视角,理解深度学习在推动NLP发展的核心作用及其未来的无限可能。 ####
|
Web App开发 安全 前端开发
『Fiddler数据抓包功攻略』| 如何使用Fiddler进行数据抓包与分析?
『Fiddler数据抓包功攻略』| 如何使用Fiddler进行数据抓包与分析?
815 0
|
前端开发 JavaScript Java
ES7、ES8、ES9、ES10、ES11、ES12都增加了那些新特性?(二)
ES7、ES8、ES9、ES10、ES11、ES12都增加了那些新特性?(二)
157 0
|
存储 Java Linux
CentOS8.4 安装ES7.13.2、Kibana 7.13.2(保姆版)
CentOS8.4 安装ES7.13.2、Kibana 7.13.2
607 0
CentOS8.4 安装ES7.13.2、Kibana 7.13.2(保姆版)
|
机器学习/深度学习 人工智能 运维
不满足当 ChatGPT “接口侠”?轻松可视化 Fine-tuning 训练你的模型!
不满足当 ChatGPT “接口侠”?轻松可视化 Fine-tuning 训练你的模型!
794 0
|
存储 计算机视觉
PACS系统源码 大型医院PACS源码 支持专业三维影像后处理功能
图像处理功能:自定义显示图像的相关信息,如姓名、年龄、设备型号等参数。提供缩放、移动、镜像、反相、旋转、滤波、锐化、伪彩、播放、窗宽窗位调节等功能。 专业三维影像后处理功能:三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜、最大/小密度投影、心脏动脉钙化分析等。
236 0
PACS系统源码 大型医院PACS源码 支持专业三维影像后处理功能
|
Cloud Native Dubbo 安全
MSE 微服务治理发布企业版,助力企业构建完整微服务治理体系
MSE 微服务治理希望能够帮助企业客户打造永远在线的业务。
MSE 微服务治理发布企业版,助力企业构建完整微服务治理体系
|
JavaScript Java 编译器
方法调用:一看就懂,一问就懵?
方法调用:一看就懂,一问就懵?
148 0
方法调用:一看就懂,一问就懵?
|
Java 数据库 Android开发
Eclipse的Java build path,可以将一个项目依赖于另外一个项目
Eclipse的Java build path,可以将一个项目依赖于另外一个项目
178 0
Eclipse的Java build path,可以将一个项目依赖于另外一个项目