zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    Linked List Cycle leetcode java (链表检测环)
    Remove Duplicates from Sorted List II leetcode java
    Remove Duplicates from Sorted List leetcode java
    Merge Two Sorted Lists leetcode java
    Swap Nodes in Pairs leetcode java
    Median of Two Sorted Array leetcode java
    阿里云最便宜的四种域名注册
    nohup和&后台运行,进程查看及终止
    ipv6转ipv4 NAT64与DNS64基本原理概述
    ros使用pppoe拨号获取ipv6,并且下发IPV6的dns到客户机win7
  • 原文地址:https://www.cnblogs.com/ayanmw/p/2682016.html
Copyright © 2011-2022 走看看