c++ - 为什么 fread 提前到达 EOF?

标签 c++ c file-io stdio feof

我正在编写一个将文件读入内存的 C 库。它跳过文件的前 54 个字节(标题),然后将其余部分作为数据读取。我用fseek判断文件的长度,然后用fread读入文件。

循环运行一次然后结束,因为到达 EOF(没有错误)。最后,bytesRead = 10624,ftell(stream) = 28726,缓冲区包含 28726 个值。我希望 fread 在到达 EOF 时读取 30,000 个字节,文件位置为 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”就是答案。为白痴徽章寻求提名。 :-)

This reference在第二段第二句中谈到它(虽然不在他们的表格中)。

MSDN直到页面的一半才讨论二进制标志。

OpenGroup提到了“b”标签的存在,但声明它“没有任何作用”。

最佳答案

也许这是一个二进制模式问题。尝试以 "r+b" 作为模式打开文件。

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

关于c++ - 为什么 fread 提前到达 EOF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/164002/

相关文章:

c++ - float 不准确导致计算错误

c - 位域在结构中的位置

c - 使用指针在 C 中复制多维数组时出现段错误

python - 取件目录 : How not to pickup files that are still being written?

matlab - 将数组保存到磁盘

c++ - boost 日志 : Support file name and line number

c++ - 为什么 windows.h 禁用包警告?

c++ - STL 中基于容器的重载

c++ - Omnet 和 Inet 链接错误 : undefined reference to typinfo

css - 有没有办法使文件输入上的 native `browse` 按钮更大跨浏览器?