C语言文件操作的细节

news2024/10/5 18:25:53

目录

文本文件和二进制文件

概念

一个数据在内存中是怎么存储的呢?

通过VS2013可以查看二进制数值

文件读取结束的判定

文件缓冲区


文本文件和二进制文件

概念

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

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

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

一个数据在内存中是怎么存储的呢?

        字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节。

通过VS2013可以查看二进制数值

直接看二进制文本看不出来,可以使用vs的功能添加现有项,这里我演示的是我一直用的test.txt,代码编译后是一个二进制的文件

 

 

 

 这里VS2013测试能够显示,VS2019显示不出来。

能够看到4个字节,以小端存储的方式存储,单位是字节

ASCII码形式存储是5个字节

 所以,二进制存储和ASCII码存储,会有大小上的差异,具体大小根据存储类型不同而不同。

比如如果是个字符型,ASCII码存储更小。

文件读取结束的判定

正确使用feof函数

        不能在文件读取过程中使用feof函数来判断文件是否结束,而是在文件读取结束后,使用feof,搭载ferror共同使用,判断文件是因为读取结束而结束还是因为读取失败而结束。

        使用读取函数时读取失败和读取结束返回值一样,要用feof和ferror来判断结束原因

        文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
        例如:
        fgetc 判断是否为 EOF .
        fgets 判断返回值是否为 NULL

         二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
        例如:

        fread判断返回值是否小于实际要读的个数。

 总结:博主认为在读取文件内容过程中判断条件应当与函数的返回值一一对应,特殊的fread返回值是实际读到的个数,每个大小为fread函数的第二个参数(以字节为单位),判断要读的和实际读到的是否相同,相同就不用feof(因为feof只能在读取结束后使用,相同并不代表读完了),不同就要判断结束原因,读取文件想知道读取是结束了还是读取失败了就可以向上方代码一样写if...else{if...else}。

文件缓冲区

 编译器与磁盘进行输入输出操作时都有一个缓冲区,因为操作系统如果一直接收数据,会打乱操作系统,所以一个缓冲区充满,再更新数据,这样操作系统提高了效率。

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

 由于以下代码进行测试是动态的,博主没有相关动图技术,所以不再演示。

#include <stdio.h>
#include <windows.h>
//VS2013 WIN10环境测试
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;
}

这里可以得出一个结论:
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
如果不做,可能导致读写文件的问题,比如内容在缓冲区中,断电就会失效,缓冲区的基本概念就是以上内容。

感谢代码玩家们的阅读,欢迎大家在评论区留言讨论,补充说明~
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv5 以txt 或json格式输出预测结果

YOLOv5 以txt 或json格式输出预测结果1.YOLOv5源码以多种格式输出预测结果1.run函数——传入参数2.run函数——保存打印2.YOLOv5以.txt格式输出预测结果1.执行以下代码就可以得到以.txt格式输出预测结果2.输出格式&#xff1a;3.YOLOv5以.json格式输出预测结果1.需要在源码中加…

零售行业交易数据分析(3)——群组/同期群分析(留存率分析)

内容简介 本文介绍了群组分析&#xff08;同期群分析&#xff09;的方法以及Python实现过程&#xff0c;并继续对一家零售公司的交易数据进行用户留存分析和可视化。 本系列的文章&#xff1a; 《零售行业交易数据分析&#xff08;1&#xff09;——客户终身价值(CLTV)计算和…

Qt扫盲-QSplitter理论总结

QSplitter理论总结一、概述二、使用说明1. 添加子控件2. 内部控件大小和位置一、概述 QSplitter允许用户通过拖动子部件之间的边界来控制子部件的大小。这个经常在我们使用的一些工具软件中最常使用 比如就像 QAssistant 里面的索引栏和内容直间&#xff0c;鼠标放在那个分界区…

3dMax中的两足动物及动画制作方法

3dMax的两足动物简介 3DMax是一款专业的3D电脑设计软件&#xff0c;用于制作3D动画、游戏、模型、图像等&#xff0c;在视频游戏开发商、影视工作室的工作中发挥着重要作用。Biped 是3D max 软件中动画的基本部分。3dMax中的Biped为角色建模中的角色部分提供运动并将其连接到现…

基于Java+SpringMvc+vue+element实现驾校管理系统详细设计

基于JavaSpringMvcvueelement实现驾校管理系统详细设计 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取…

PPI网络的构建与美化(String+Cytoscape)

目录写在前面一、使用string分析数据二、使用Cytoscape构建网络1. 导入TSV文件2. Analyze Network3. Generate Style4. CytoNCA计算Betweenness三、美化网络1. 根据Betweenness调整网络2. 选择你需要的蛋白&#xff0c;做个双环网络图3. 调整字体大小颜色、气泡大小等4. 保存图…

【TypeScript】JavaScript VS TypeScript数据类型

&#x1f4ad;&#x1f4ad; ✨&#xff1a;JavaScript VS TypeScript数据类型   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: 你若盛开&#xff0c;清风自来&#x1f49c;&#x1f49c;   &#x1f338;: 如有错误或不足之处&#xff0c;希望可以指正&…

【TS】TypeScript 实践中的 Equals 是如何工作的?

How does the Equals work in typescript 循着线索慢慢来 在 ts 中如何判断两种类型完全一致&#xff1f; 三年前&#xff0c;在社区有一场关于支持 type level equal operator 的讨论 TypeScript#27024。 大佬 mattmccutchen 给出了一个非常精彩的解决方案&#xff1a; Her…

智公网:教师编的这些规则要知道!

1、有了教师资格证&#xff0c;是否还需要考取编制&#xff1f; 答&#xff1a;有了教师资格证之后是需要继续教师编制考试的。只有通过了教师编制考试才能有教师编&#xff0c;只有一个教师资格证&#xff0c;只能证明是具备了从业资格。通过教师编制的人员被称为在编人员&am…

【Web开发】Python实现Web图表功能(D-Tale编译打包)

&#x1f37a;基于Flask实现服务器的相关文章如下&#x1f37a;&#xff1a; &#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask快速入门&#xff09;&#x1f388;&#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask案例测试&#xff09;&#x1f3…

MySQL中SQL语句执行顺序及优化

概要 本文章主要是分析SQL语句关键字的执行顺序&#xff0c;以及在每一个阶段我们有哪些优化&#xff0c;可以去做哪些优化&#xff0c;和注意事项。 1. SQL语句关键字的执行顺序 通常我们执行一条SQL语句它的执行顺序如下 selectfrom.joinwheregroup byhavingorder by聚合函…

Vitepress(二):部署

什么是Git Page github Pages可以被认为是用户编写的、托管在github上的静态网页。 github pages有300M免费空间&#xff0c;资料自己管理&#xff0c;保存可靠&#xff1b; 实现项目自动推送到Github 首先新建一个自己的项目用于存放github pages的内容 格式是 自己githu…

《元宇宙2086》影视工业弯道超车?《科普时报》刊登采访报道

科普时报-第267期 2023年01月06日 星期五 第05版&#xff1a;书香文史刊载了题目为“《元宇宙2086》影视工业弯道超车&#xff1f;”的关于高泽龙的采访报道。全文内容如下&#xff1a;在2022年中国金鸡百花电影节暨第35届中国电影金鸡奖期间&#xff0c;我创作的中国首部元宇宙…

Linux开发工具的使用(二)

文章目录Linux开发工具的使用&#xff08;二&#xff09;1.Linux编译器gcc/g使用1.1 背景1.2 验证每一个阶段的效果1.2.1 预处理1.2.2 编译1.2.3 汇编1.2.4 链接1.2.5 记忆1.3 链接的理解1.3.1 ldd指令1.3.2 预备1.3.3 动态库和静态库感性理解到实际理解2.Linux项目自动化构建工…

吴恩达《机器学习》——SVM支持向量机

SVM支持向量机1. 线性SVM1.1 从Logistic回归出发1.2 大边界分类与SVM1.3 调整正则化参数2. 非线性SVM&#xff08;高斯核函数&#xff09;2.1 高斯核2.2 非线性分类2.3 参数搜索数据集、源文件可以在Github项目中获得 链接: https://github.com/Raymond-Yang-2001/AndrewNg-Mac…

Java编程基础

1&#xff0c;基本概念 &#xff08;1&#xff09;JDK、JRE、JVM的关系&#xff1a; JDK&#xff1a;Java Development Kit&#xff0c;Java开发工具包JRE: Java Runtime Environment&#xff0c;Java运行环境JVM&#xff1a;Java Virtual Machine&#xff0c;Java虚拟机JDK包…

2023年山东最新建筑八大员(电气施工员)模拟真题题库及答案

百分百题库提供建筑八大员&#xff08;电气&#xff09;考试试题、建筑八大员&#xff08;电气&#xff09;考试预测题、建筑八大员&#xff08;电气&#xff09;考试真题、建筑八大员&#xff08;电气&#xff09;证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&…

【UE4 第一人称射击游戏】22-拾取弹药

上一篇&#xff1a;【UE4 第一人称射击游戏】21-添加动态扩散准心本篇效果&#xff1a;当角色触碰到弹药箱后&#xff0c;玩家的后备弹夹就会多50发子弹&#xff0c;并且触碰到弹药箱后&#xff0c;会播放相应的声音和粒子特效。步骤&#xff1a;新建一个蓝图类&#xff08;父类…

MySQL-5.7 innodb在线DDL操作(增删改索引、列、外键、表、外键)

基本概念 在开始阅读前&#xff0c;先熟悉下以下概念&#xff0c;以便更加方便理解。 DML DML&#xff08;Data Manipulation Language&#xff09;数据操作语言-数据库的基本操作&#xff0c;SQL中处理数据等操作统称为数据操纵语言,简而言之就是实现了基本的“增删改查”操作…

jenkins中错误总结

每次使用jenkins都会遇到不同的bug&#xff0c;接下来我们看一下这几个 libXrender.so.1: cannot open shared object file: No such file or directory 接下来我们看一下解决方案,一步一步安装好就可以了 yum install ksh -y yum install libXext.so.6 -y yum install libX…