当未达到EOF时,feof()返回true

时间:2010-12-14 16:17:18

标签: c++ fopen feof

我正在尝试从特定偏移量的文件中读取(简化版本):

typedef unsigned char u8;
FILE *data_fp = fopen("C:\\some_file.dat", "r");
fseek(data_fp, 0x004d0a68, SEEK_SET); // move filepointer to offset
u8 *data = new u8[0x3F0];
fread(data, 0x3F0, 1, data_fp);
delete[] data;
fclose(data_fp);

问题变成了,数据不会包含1008个字节,而是529(似乎是随机的)。当它达到529字节时,对feof(data_fp)的调用将开始返回true。

我也试过用较小的块(一次8个字节)读取它,但它看起来好像它已经没有了它就击中了EOF。

十六进制编辑器中的简单外观显示there are plenty of bytes left

4 个答案:

答案 0 :(得分:4)

以文本模式打开文件,就像你正在做的那样,使库将一些文件内容转换为其他内容,可能会触发无根据的EOF或错误的偏移计算。

通过将“b”选项传递给fopen调用

,以二进制模式打开文件
fopen(filename, "rb");

答案 1 :(得分:1)

文件是否被其他应用程序并行写入?也许存在竞争条件,因此文件在读取停止的任何地方结束,当读取正在运行时,但稍后当您检查它时,其余部分已被写入。这也可以解释随机性。

答案 2 :(得分:1)

也许这是文本文件和二进制文件之间的区别。如果你在Windows上,换行符是CRLF,它是文件中的两个字符,但在读取时只转换为一个字符。尝试使用fopen(...,“rb”)

答案 3 :(得分:0)

我无法看到您的工作链接,但如果您的计算机声称不存在更多字节,我倾向于相信它。为什么不打印文件的大小而不是在十六进制编辑器中手工操作?

另外,你最好使用2级I / O,f-calls是古老的C ugliness,你使用的是C ++,因为你有新的。

int fh =open(filename, O_RDONLY);
struct stat s;
fstat(fh, s);
cout << "size=" << hex << s.st_size << "\n";

现在使用2级I / O调用进行搜索和阅读,无论如何都要更快,让我们看看文件的大小是什么。