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

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。

我还试图阅读较小的块(一次单字节),但是当它还不存在时,它看起来像是碰到EOF。

十六进制编辑器中的简单外观显示 剩下很多字节.

有帮助吗?

解决方案

像您这样做一样,以文本模式打开文件,使库将一些文件内容转换为其他内容,并可能触发不必要的EOF或不良偏移计算。

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

fopen(filename, "rb");

其他提示

文件是否由其他应用程序并行写入?也许有一个种族条件,因此文件在读取停止,读取时的任何地方结束,但是稍后在检查其余时,其余的都已写成。这也可以解释随机性。

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

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

另外,您最好使用2级I/o f-calls是古老的coudiness,并且因为您有新的速度。

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

现在,使用2级I/O调用来进行您的寻求和阅读,无论如何,它们的大小是什么大小 真的 是。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top