feof多读一次数据的问题
在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()或者fread执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。
开始我的代码是这样的
{
char ch;
char str[64];
int a;
int b;
float f;
} TEST_T;
int file_option_struck()
{
TEST_T stInfo1 = {'a',"这是一个结构体里的字符串",666,888,3.1415926};
TEST_T stInfo2 = {'b',"这是测试结构体数据块的写入和读取",111,999,1.234567};
TEST_T stTemp;
FILE *fp;
int i=0;
{
printf("创建文件失败!\n");
}
else
{
printf("创建文件成功!\n");
}
fwrite(&stInfo1,sizeof(stInfo1),1,fp);
fwrite(&stInfo2,sizeof(stInfo2),1,fp);
{
fread(&stTemp,sizeof(stTemp),1,fp);
printf("char=%c,str=%s,i1=%d,i2=%d,f=%lf\n",stTemp.ch,stTemp.str,
stTemp.a,stTemp.b,stTemp.f);
printf("这是第%d次读数据块\n",i);
}
就多出了一条数据
后来在网上找了相关的解释
如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()清除。
EOF是文本文件结束的标志。在文本文件中,数据是以字符的ASCⅡ代码值的形式存放,普通字符的ASCⅡ代码的范围是32到127(十进制),EOF的16进制代码为0xFF(十进制为-1),因此可以用EOF作为文件结束标志。[1]
当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。为解决这一个问题,ASCI C提供一个feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用以判断文本文件。
“C”语言的“feof()”函数和数据库中“eof()”函数的运作是完全不同的。数据库中“eof()”函数读取当前指针的位置,“C”语言的“feof()”函数返回的是最后一次“读操作的内容”。多年来把“位置和内容”相混,从而造成了对这一概念的似是而非。
那么,位置和内容到底有何不同呢?举个简单的例子,比如有人说“你走到火车的最后一节车箱”这就是位置。而如果说“请你一直向后走,摸到铁轨结束”这就是内容。也就是说用内容来判断会“多走一节”。这就是完全依赖于“while(!feof(FP)){...}”进行文件复制时,目标文档总会比源文档“多出一些”的原因。
在“C”文件读取操作时不能完全依赖于“while(!feof(FP)){...}”的判断。下面代码是改进后的代码,该代码执行后output文件内容和input文件内容一致,与使用“while(!feof(FP)){...}”相比,output文件的结尾符号(EOF)没有被读入到input文件中。
根据解释,对源程序做了一点儿小的改动
然后可以看到,读取数据就正常了
feof多读一次数据的问题相关推荐
- 一文读懂大数据平台——写给大数据开发初学者的话!
一文读懂大数据平台--写给大数据开发初学者的话! 文|miao君 导读: 第一章:初识Hadoop 第二章:更高效的WordCount 第三章:把别处的数据搞到Hadoop上 第四章:把Hado ...
- PHP使用feof()函数读文件的方法
这篇文章主要介绍了PHP使用feof()函数读文件的方法,以实例形式对比了正确与错误的用法,阐明了feof()函数的使用技巧,需要的朋友可以参考下 本文实例讲述了PHP使用feof()函数读文件的方法 ...
- getprivateprofilestring读不到数据_Tomcat NIO(11)请求数据读取
在上一篇文章里我们主要介绍了 tomcat io 线程中涉及到的主要核心类,包括 AbstractProcessorLight,Http11Processor,CoyoteAdapter,这里主要介绍 ...
- 一纸读懂另类数据 | 未央研究
一纸读懂另类数据 | 未央研究 未央研究 清华大学五道口金融学院 今天 什么是另类数据? 1.定义 另类数据(Alternative Data)是不同于传统的交易所披露.公司公告披露的新数据,是有利于 ...
- Opencv使用imread函数时,读到的数据为空
问题描述:使用opencv的imread函数时,读到的数据为空. 程序: Mat img;string namepic="street.png";img = imread(name ...
- 【图解】九张图带你读懂大数据医疗
文章讲的是[图解]九张图带你读懂大数据医疗,互联网大框架的结构下,互联网+医疗的个性化服务,能给医疗保健工作者和消费者带来哪些真正的福利呢,首先可以提高效益减少废物.增强了预防传染病的能力.对于个人公 ...
- 《一本书读懂大数据营销 玩透大数据营销 创造网络营销奇迹》pdf下载 百度云
<一本书读懂大数据营销 玩透大数据营销 创造网络营销奇迹>pdf下载请到文末! 在使用低对比度光源的摄影作品中,辣椒的阴影不再是清晰可见的,阴影的线条也不再"生硬" ...
- USBHID-BUS Hound能抓到数据但上位机读不到数据
调试USBHID设备的时候,遇到一个问题,BUSHound能正确抓到下位机上传的的数据,但是使用其他上位机却读不到数据,甚至会崩溃. 当然,自然而然地怀疑有可能是上位机的问题,可靠的排查方法当然是要排 ...
- 一本书读懂大数据(每个人都看得懂的大数据入门书) - 电子书下载(高清版PDF格式+EPUB格式)...
一本书读懂大数据(每个人都看得懂的大数据入门书)-黄颖 在线阅读 百度网盘下载(635f) 书名:一本书读懂大数据(每个人都看得懂的大数据入门书) 作者:黄颖 格式 ...
最新文章
- matebook14支持触摸屏吗_华为MateBook 14 2021发布,触摸屏成标配
- Baseline needs more love
- windows 配置C++环境
- Codeforces 892E Envy
- Oracle服务器修改IP后
- Linux常出现的面试试题
- 多任务学习(MTL)在转化率预估上的应用
- windows10环境下VMware14中Ubuntu16.04解决如何上网问题
- SparkStreaming窗口入门
- 易语言-MD5加密16位和32位方法
- Netflix Ribbon 负载均衡 概述 与 基本使用
- java递归生成无限层级的树--分类管理
- 入职中国人寿是个坑?
- 用matlab画矩形波傅里叶变换,用matlab画出余弦函数的傅里叶变换图像
- nginx 访问a 域名跳转到b域名_微信qq域名防红防封,怎么才能避免自己的域名被屏蔽...
- shell脚本——awk详细介绍(包含应用案例)
- M,BB面试+职业求教
- 和刘备相关的人(四)
- Origin制图之热力图(hot-map)
- Android:修改默认音量等级
热门文章
- 《LeetCode》—— 摆动序列
- win7开启uasp协议_WIN7 USB加速方法
- CSDN文章无法发布问题,显示网络操作超时
- Python os._exit() sys.exit() exit()区别
- 阿里云李飞飞:云数据库成行业事实标准,瑶池正在带领国产数据库换道超车
- 哪种平板电脑适合一级计算机考证
- MSE 微服务治理发布企业版,助力企业构建完整微服务治理体系
- 尽管颓废了一年,但我仍未放弃梦想「2021年终总结」
- vue中实现菜单栏的拖拽
- xshell 隧道 mysql_u盟及xshell的mysql或redis隧道的配置等-------windows