2

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

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。

在十六进制编辑器中简单查看显示还有大量字节

4

4 回答 4

4

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

通过将“b”选项传递给 fopen 调用,以二进制模式打开文件

fopen(filename, "rb");
于 2010-12-14T16:29:41.903 回答
1

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

于 2010-12-14T16:19:50.873 回答
1

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

于 2010-12-14T16:31:07.190 回答
0

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

此外,您最好使用 2 级 I/O,因为 f 调用是古老的 C 丑陋,而且您使用的是 C++,因为您有新的。

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

现在使用 2 级 I/O 调用进行查找和读取,无论如何这更快,让我们看看文件的实际大小。

于 2010-12-14T16:36:11.013 回答