在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()或者fread执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。

开始我的代码是这样的

typedef struct
{
    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;
if(NULL == (fp = fopen("X:\\FileTest\\filetext.txt","w+")))
    {
        printf("创建文件失败!\n");
    }
    else
    {
        printf("创建文件成功!\n");
    }

    fwrite(&stInfo1,sizeof(stInfo1),1,fp);
    fwrite(&stInfo2,sizeof(stInfo2),1,fp);
rewind(fp);
while(0 == feof(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);
i++;
        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多读一次数据的问题相关推荐

  1. 一文读懂大数据平台——写给大数据开发初学者的话!

     一文读懂大数据平台--写给大数据开发初学者的话! 文|miao君 导读: 第一章:初识Hadoop 第二章:更高效的WordCount 第三章:把别处的数据搞到Hadoop上 第四章:把Hado ...

  2. PHP使用feof()函数读文件的方法

    这篇文章主要介绍了PHP使用feof()函数读文件的方法,以实例形式对比了正确与错误的用法,阐明了feof()函数的使用技巧,需要的朋友可以参考下 本文实例讲述了PHP使用feof()函数读文件的方法 ...

  3. getprivateprofilestring读不到数据_Tomcat NIO(11)请求数据读取

    在上一篇文章里我们主要介绍了 tomcat io 线程中涉及到的主要核心类,包括 AbstractProcessorLight,Http11Processor,CoyoteAdapter,这里主要介绍 ...

  4. 一纸读懂另类数据 | 未央研究

    一纸读懂另类数据 | 未央研究 未央研究 清华大学五道口金融学院 今天 什么是另类数据? 1.定义 另类数据(Alternative Data)是不同于传统的交易所披露.公司公告披露的新数据,是有利于 ...

  5. Opencv使用imread函数时,读到的数据为空

    问题描述:使用opencv的imread函数时,读到的数据为空. 程序: Mat img;string namepic="street.png";img = imread(name ...

  6. 【图解】九张图带你读懂大数据医疗

    文章讲的是[图解]九张图带你读懂大数据医疗,互联网大框架的结构下,互联网+医疗的个性化服务,能给医疗保健工作者和消费者带来哪些真正的福利呢,首先可以提高效益减少废物.增强了预防传染病的能力.对于个人公 ...

  7. 《一本书读懂大数据营销 玩透大数据营销 创造网络营销奇迹》pdf下载 百度云

    <一本书读懂大数据营销  玩透大数据营销  创造网络营销奇迹>pdf下载请到文末! 在使用低对比度光源的摄影作品中,辣椒的阴影不再是清晰可见的,阴影的线条也不再"生硬" ...

  8. USBHID-BUS Hound能抓到数据但上位机读不到数据

    调试USBHID设备的时候,遇到一个问题,BUSHound能正确抓到下位机上传的的数据,但是使用其他上位机却读不到数据,甚至会崩溃. 当然,自然而然地怀疑有可能是上位机的问题,可靠的排查方法当然是要排 ...

  9. 一本书读懂大数据(每个人都看得懂的大数据入门书) - 电子书下载(高清版PDF格式+EPUB格式)...

    一本书读懂大数据(每个人都看得懂的大数据入门书)-黄颖 在线阅读                   百度网盘下载(635f) 书名:一本书读懂大数据(每个人都看得懂的大数据入门书) 作者:黄颖 格式 ...

最新文章

  1. matebook14支持触摸屏吗_华为MateBook 14 2021发布,触摸屏成标配
  2. Baseline needs more love
  3. windows 配置C++环境
  4. Codeforces 892E Envy
  5. Oracle服务器修改IP后
  6. Linux常出现的面试试题
  7. 多任务学习(MTL)在转化率预估上的应用
  8. windows10环境下VMware14中Ubuntu16.04解决如何上网问题
  9. SparkStreaming窗口入门
  10. 易语言-MD5加密16位和32位方法
  11. Netflix Ribbon 负载均衡 概述 与 基本使用
  12. java递归生成无限层级的树--分类管理
  13. 入职中国人寿是个坑?
  14. 用matlab画矩形波傅里叶变换,用matlab画出余弦函数的傅里叶变换图像
  15. nginx 访问a 域名跳转到b域名_微信qq域名防红防封,怎么才能避免自己的域名被屏蔽...
  16. shell脚本——awk详细介绍(包含应用案例)
  17. M,BB面试+职业求教
  18. 和刘备相关的人(四)
  19. Origin制图之热力图(hot-map)
  20. Android:修改默认音量等级

热门文章

  1. 《LeetCode》—— 摆动序列
  2. win7开启uasp协议_WIN7 USB加速方法
  3. CSDN文章无法发布问题,显示网络操作超时
  4. Python os._exit() sys.exit() exit()区别
  5. 阿里云李飞飞:云数据库成行业事实标准,瑶池正在带领国产数据库换道超车
  6. 哪种平板电脑适合一级计算机考证
  7. MSE 微服务治理发布企业版,助力企业构建完整微服务治理体系
  8. 尽管颓废了一年,但我仍未放弃梦想「2021年终总结」
  9. vue中实现菜单栏的拖拽
  10. xshell 隧道 mysql_u盟及xshell的mysql或redis隧道的配置等-------windows