位置: IT常识 - 正文

【C语言进阶】文本与二进制操作文件,优化通讯录。(c语音进阶)

编辑:rootadmin
【C语言进阶】文本与二进制操作文件,优化通讯录。 前言:

推荐整理分享【C语言进阶】文本与二进制操作文件,优化通讯录。(c语音进阶),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:c语言如何进阶 知乎,c语音进阶,c语言的进阶知识有哪些,c语言进阶学什么,c语言进阶书籍,c语言 进阶,c语言进阶教程,c语言进阶书籍,内容如对您有帮助,希望把文章链接给更多的朋友!

上篇文章,我们已经学习了有关本地磁盘文件的常用文件操作,已经能够对本地文件进行调用与读写。我们磁盘中还存在着一些内容用二进制存储的文件,这也就是我们今天将要讲解的内容。

一、文本文件与二进制文件

根据数据的组织形式,我们将数据文件称为文本文件和而二进制文件。

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

那么数据在内存中是如何存储的的呢?

实际上字符在内存中的存储一律是以ASCII码值得形式进行存储的,而数值型数据既可以用ASCII码存储,也可以用二进制形式进行存储。例如十进制数字10000在进行存储时,就可以有两种存储形式:

①二进制形式:00000000 00000000 00100111 00010000②ASCII码形式:00110001 00110000 00110000 00110000 1 0 0 0

接着让我们来看看示例:

#include <stdio.h>int main(){int a = 10000;FILE* pf = fopen("test.txt", "wb");//wb表示只写模式打开二进制文件if (pf == NULL){perror(fopen);}else{fwrite(&a, 4, 1, pf);//二进制的形式写到文件中//将变量a中的数据,每四个字节存储一次,写入文件指针pf指向的文件;fclose(pf);}pf = NULL;return 0;}

在上面这段代码运行成功后,我们就已经成功将变量a中的数据写入到本地磁盘对应的txt文件中了,可是我们发现,当我们尝试打开本地文件查看存储的数据时,里面看起来并不是我们所想要的东西:

导致这样的原因是因为我们使用了“wb”方式,即以二进制形式进行了写入,而要查看这部分内容我们只需要将文件添加到vs里面并且将打开方式改为二进制编制器。

具体步骤:选中我们的“源文件”栏右击选择“添加”,“添加现有项”,将写入时创建的txt文件添加进来,然后选中该文件,右击选择"打开方式"接着在选项框中下拉选择“二进制编制器”,此时我们便可以看到文件内的实际存储情况了:

但是这好像也不是我们存储的数据,我们再来看看我的的语句:

fwrite(&a,4,1,pf);

根据这条语句,我们在进行数据写入时,是每次四个字节进行写入的,于是根据其二进制码可以得到它的存储为:

【C语言进阶】文本与二进制操作文件,优化通讯录。(c语音进阶)

00000000 00000000 00100111 00010000我们再将它每四个字节分开来:0000 0000 0000 0000 0010 0111 0001 0000于是就可以得到:00 00 27 10

又因为在之前我们就验证过vs采用的是小端存储模式,于是在进行压栈时会将数据进行倒置存储,于是就有:

10 27 00 00

二、文件读取结束的判断:1.被错误使用feof函数:

在我们日常写代码过程,有很多人都会错误地使用了feof函数,将其用于判断文件是否读取结束,而这种使用方式是错误的。

大家一定要牢记:

在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。 而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

2.判断文件读取结束:

文本文件判断文件读取结束方法:

①使用fgetc函数判断是否为EOF;②使用fgrts函数判断返回值是否为NULL;

例如:

#include <stdio.h>#include <stdlib.h>int main(){int c;// 注意:int,非char,要求处理EOFFILE* fp = fopen("test.txt", "r");if (!fp){perror("File opening failed");return 1;}//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOFwhile ((c= fgetc(fp)) != EOF)// 标准C I/O读取文件循环{putchar(c);}//判断是什么原因结束的if (ferror(fp)){puts("I/O error when reading");}else if(feof(fp)){puts("End of file reached successfully");}fclose(fp);fp = NULL;return 0;}

二进制文件判断文件读取结束方法:

使用fread函数判断返回值是否小于实际要读取的数据个数

例如:

#include <stdio.h>enum { SIZE = 5 };int main(){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 handlingif (feof(fp))printf("Error reading test.bin: unexpected end of file\n");else if (ferror(fp)) {perror("Error reading test.bin");}}fclose(fp);    fp=NULL;}三、文件缓冲区:

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

这边可以通过代码来验证缓冲区:

#include <stdio.h>#include <windows.h>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语言程序代码的编写过程中,在对文件进行操作时,需要刷新缓冲区并在文件操作结束时关闭文件,否则就可能导致文件的读写操作出现问题。

总结:

经过今天的学习,我们关于文件操作与管理的内容就学完了,大家可以尝试优化自己之前写的通讯录,让联系人信息真正意义的保存下来。

本文链接地址:https://www.jiuchutong.com/zhishi/300672.html 转载请保留说明!

上一篇:bert-bilstm-crf提升NER模型效果的方法(bert数据增强)

下一篇:3分钟让你学会axios在vue项目中的基本用法(建议收藏)(怎么才能学a1)

  • 软文在企业网站推广中发挥的作用, 网络软性推广形式(软文的平台)

    软文在企业网站推广中发挥的作用, 网络软性推广形式(软文的平台)

  • word怎么做全页横线(word怎么做全页横线没有边框)

    word怎么做全页横线(word怎么做全页横线没有边框)

  • 小米手机应用行为记录怎么查看(小米手机应用行为记录怎么关闭0)

    小米手机应用行为记录怎么查看(小米手机应用行为记录怎么关闭0)

  • 酷狗音乐歌词状态栏怎么关闭(酷狗的歌词)

    酷狗音乐歌词状态栏怎么关闭(酷狗的歌词)

  • 苹果手机一直显示耳机模式怎么办(苹果手机一直显示3小时后再试)

    苹果手机一直显示耳机模式怎么办(苹果手机一直显示3小时后再试)

  • 华为nova7支持人脸识别的吗(华为nova7是否支持nfc)

    华为nova7支持人脸识别的吗(华为nova7是否支持nfc)

  • vivo NEX 3s有没有指纹识别功能(vivonex3s有没有红外)

    vivo NEX 3s有没有指纹识别功能(vivonex3s有没有红外)

  • 微信视频来电的声音在哪里设置(微信视频来电的铃声视频怎么设置?)

    微信视频来电的声音在哪里设置(微信视频来电的铃声视频怎么设置?)

  • 卡贴机为什么那么便宜(卡贴机今天都用不了了?)

    卡贴机为什么那么便宜(卡贴机今天都用不了了?)

  • Http是不是一种主要用于加密的协议

    Http是不是一种主要用于加密的协议

  • 该boos账号已被系统冻结(boss由于账号涉及违规)

    该boos账号已被系统冻结(boss由于账号涉及违规)

  • 抖音看不了别人的关注和粉丝(抖音看不了别人的作品显示网络错误)

    抖音看不了别人的关注和粉丝(抖音看不了别人的作品显示网络错误)

  • 华为p40pro自带膜要不要撕掉(p40 pro 自带膜)

    华为p40pro自带膜要不要撕掉(p40 pro 自带膜)

  • 华为手机补电对手机有没有影响(华为手机补电对电池有影响吗)

    华为手机补电对手机有没有影响(华为手机补电对电池有影响吗)

  • 摄像头不聚焦模糊是什么原因(摄像头不聚焦是什么意思)

    摄像头不聚焦模糊是什么原因(摄像头不聚焦是什么意思)

  • e35没有信号什么意思(e35无信号)

    e35没有信号什么意思(e35无信号)

  • wr886n无线桥接成功上不了网(wr886n无线桥接成功不能上网)

    wr886n无线桥接成功上不了网(wr886n无线桥接成功不能上网)

  • 华为y9在国内叫什么型号(华为y9s国内叫什么)

    华为y9在国内叫什么型号(华为y9s国内叫什么)

  • 苹果11和苹果x屏幕一样大吗(苹果11屏幕和苹果x)

    苹果11和苹果x屏幕一样大吗(苹果11屏幕和苹果x)

  • 电话只能打出去打不进来怎么回事(手机卡打不进电话只能打出去)

    电话只能打出去打不进来怎么回事(手机卡打不进电话只能打出去)

  • 创微信号不用手机号码(创微信号不用手机怎么弄)

    创微信号不用手机号码(创微信号不用手机怎么弄)

  • 抖音老号找回解决方法(抖音老号找回解决方法微信)

    抖音老号找回解决方法(抖音老号找回解决方法微信)

  • 怎么取消淘宝提醒的商品(怎么取消淘宝提醒设置)

    怎么取消淘宝提醒的商品(怎么取消淘宝提醒设置)

  • oppoa57怎么弄时间(oppo手机怎么设时间)

    oppoa57怎么弄时间(oppo手机怎么设时间)

  • 苹果6有128g的吗国行(苹果手机6有128g的吗)

    苹果6有128g的吗国行(苹果手机6有128g的吗)

  • 新版本快手怎样竞猜(快手怎么这样啊)

    新版本快手怎样竞猜(快手怎么这样啊)

  • 手机为什么不能打电话(手机为什么不能闪充了)

    手机为什么不能打电话(手机为什么不能闪充了)

  • wps怎么截图(wps怎么截图选中区域)

    wps怎么截图(wps怎么截图选中区域)

  • 荣耀 X10 推送鸿蒙 HarmonyOS 2.0.0.185 更新:新增密码保险箱功能、优化操作特效等(荣耀x10的鸿蒙系统怎么开启)

    荣耀 X10 推送鸿蒙 HarmonyOS 2.0.0.185 更新:新增密码保险箱功能、优化操作特效等(荣耀x10的鸿蒙系统怎么开启)

  • 退回多交城建税税金会计分录
  • 其他应付款贷方负数怎么调整
  • 完税证明能作为理赔依据吗
  • 美团收取的佣金怎么开票
  • 企业付的快递费是扣增值税还是进入费用扣除
  • 金税盘没有及时清卡怎么办
  • 税务局代个人开发票交什么税
  • 滴滴的发票能不能作废
  • 减免税金需要计提吗
  • 建筑挂靠企业账务处理
  • 建筑服务专用发票需要进项吗
  • 工业企业如何进行设备的选购管理
  • 研发费用加计扣除行业
  • 广告费怎么入账
  • 纳税义务未发生是什么意思
  • 取得与收益相关的政府补助会计分录
  • 企业微信收款如何同步给别人
  • 房地产开发企业预收款预缴增值税
  • 企业财务会计制度范本
  • 餐饮管理公司设哪些科目
  • 开发票零税率和免税是一样的意思吗
  • 税控盘减免怎么做账
  • 买标书怎么做分录
  • 公司替员工承担个税分录不再收回
  • 分期付款购入原材料怎么做账
  • 收到留抵税额退税怎么做分录
  • 进口增值税13可以抵扣多少
  • 在win7中怎么安转只兼容win10的软件
  • system进程占用cpu突然变高
  • 短期借款应付利息列报
  • 大陆公司如何开离岸账户
  • 承兑开出去能收回吗
  • 怎么登记总分类账簿
  • 自制原始凭证包括哪些凭证
  • 0x0000001e蓝屏代码的含义
  • 小规模纳税人多少钱不用交税
  • 交易性金融资产的入账价值
  • 苏格兰高地什么意思
  • 投资收益结转到哪个科目
  • 购买商品的会计分录贷方能写应付账款
  • 小企业如何记账
  • 出口抵扣进项的设备免税依据
  • javascript创建对象及应用
  • 后处理作用
  • aws documentation
  • php目录结构
  • 管家婆软件出库入库如何用
  • 发票备注栏填写样板
  • 如何扣除企业接单费用
  • MySQL中使用_____语句更新表中的数据
  • 织梦的首页怎么换图片
  • 允许从销项税额中扣除的有
  • 退物业费如何记帐
  • 股权收购协议书实际案例
  • 服务类发票怎么做分录
  • 预付卡充值入什么科目
  • 公司做的形象墙效果图
  • 购建固定资产属于投资活动吗
  • 购入无形资产属于资产吗
  • 什么是权益性投资企业
  • mysql中日期格式
  • mysql 5.7.17 64bit安装配置方法图文教程
  • windows更新9%
  • centos san
  • winscope是什么意思
  • linux 安装vs
  • win7还原电脑系统的步骤
  • windows10直接安装
  • cocos2dx AudioEngine初体验,音效播放结束判断测试
  • javascript 引入
  • bat基本语法
  • js怎么检查错误
  • python移动目标跟踪
  • 郑州税务局电话客服电话
  • 江苏国家电子税务局网站
  • ukey开票人是管理员改胃自己时只能开电子发票
  • 洛阳契税首套房认定标准
  • 税务人的形象
  • 国家税务总局中山市税务局港口税务分局
  • 贵阳地铁报销凭证
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设