当前位置:  开发笔记 > 编程语言 > 正文

为什么fread会提早到达EOF?

如何解决《为什么fread会提早到达EOF?》经验,为你挑选了1个好方法。

我正在编写一个将文件读入内存的C库.它会跳过文件的前54个字节(标题),然后将余数作为数据读取.我使用fseek来确定文件的长度,然后使用fread来读取文件.

循环运行一次然后结束,因为达到了EOF(没有错误).最后,bytesRead = 10624,ftell(stream)= 28726,缓冲区包含28726个值.我希望fread读取30,000字节,当达到EOF时文件位置为30054.

C不是我的母语所以我怀疑我在某个地方有一个愚蠢的初学者错误.

代码如下:

const size_t headerLen = 54;

FILE * stream;
errno_t ferrno = fopen_s( &stream, filename.c_str(), "r" );
if(ferrno!=0) {
  return -1;
}

fseek( stream, 0L, SEEK_END );
size_t bytesTotal = (size_t)(ftell( stream )) - headerLen; //number of data bytes to read
size_t bytesRead = 0;
BYTE* localBuffer = new BYTE[bytesTotal];
fseek(stream,headerLen,SEEK_SET);
while(!feof(stream) && !ferror(stream)) {
    size_t result = fread(localBuffer+bytesRead,sizeof(BYTE),bytesTotal-bytesRead,stream);
    bytesRead+=result;
}

根据您使用的参考,很明显在模式标志中添加"b"就是答案.寻求骷髅徽章的提名.:-)

该引用在第二段,第二句(虽然不在他们的表中)中讨论它.

MSDN直到页面中间才讨论二进制标志.

OpenGroup提到了"b"标签的存在,但声明它"应该没有效果".



1> Evan Teran..:

也许这是一个二元模式问题.尝试打开文件"r+b"以模式.

编辑:如评论"rb"中所述,可能更符合您的原始意图,因为"r+b"它会打开它进行读/写并且"rb"是只读的.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有