• fread返回值0 feof返回值为16 问题解决。


    写的一个程序,要从二进制文件中读取,但是我读取到11396字节的时候 fread返回0,其feof(fp)==16

    百度百科看到:

      feof(fp)有两个返回值:如果遇到文件结束,函数feof(fp)的值为非零值,否则为0。
      EOF是文本文件结束的标志。在文本文件中,数据是以字符的ASCⅡ代码值的形式存放,普通字符的ASCⅡ代码的范围是32到127(十进制),EOF的16进制代码为0x1A(十进制为26),因此可以用EOF作为文件结束标志。
      当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。为解决这一个问题,ASCI C提供一个feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用以判断文本文件。
      “C”语言的“feof()”函数和数据库中“eof()”函数的运做是完全不同的。数据库中“eof()”函数读取当前指针的位置,“C”语言的“feof()”函数返回的是最后一次“读操作的内容”。多年来把“位置和内容”相混,从而造成了对这一概念的似是而非。

    第一句话 真是误导人啊,我明明没到文件结束,却返回非0.

    继续看,原来根据读入的如果是 0x1A 就是feof非0 靠,我一看我的11396-8 字节,正是0x1A。

    怎么办呢?

    我的fp是这么fopen的

    fopen(this->relativeRoadIDFileName,"r");

    r 改成 rb 即可。终于明白了,本以为 b 没啥用呢。。对了 在linux下 b 应该没用。 所以 这个情况 只在非posix环境下才是的。

    这是  fopen 百度百科 里面 说的。

    所以百度百科 feof里面 应该 有三种返回值 0 1 非0和1的。

    还有 fread第二个参数,如果 实际没有读取那么多,则fread返回值 则可能小于 count。见:

    http://yijiuzai.blog.163.com/blog/static/1037567272010417103312770/

  • 相关阅读:
    UVA 1386 Cellular Automaton
    ZOJ 3331 Process the Tasks
    CodeForces 650B Image Preview
    CodeForces 650A Watchmen
    CodeForces 651B Beautiful Paintings
    CodeForces 651A Joysticks
    HUST 1601 Shepherd
    HUST 1602 Substring
    HUST 1600 Lucky Numbers
    POJ 3991 Seinfeld
  • 原文地址:https://www.cnblogs.com/ayanmw/p/2682016.html
Copyright © 2020-2023  润新知