0

我正在使用 C++ 中的 FILE 对象读取二进制文件的片段。这是 fseek 和相应的 fread 调用:

fseek(fp, startLocation, SEEK_SET);
fread(data, m_sizeOfData, 1, fp);

m_sizeOfData 最终是一个大于 40 万的整数。这似乎应该将二进制文件中的所有 40 万+字节读入数据(顺便说一下,这是一个 char[m_sizeOfData]),但是它在一个看起来像一个盒子的 unicode 字符处大约 6 或 7 个字符后停止。我在想它可能代表一个空终止?我对此并不积极。我正在阅读的每个文件都不是这种情况。大多数似乎(通常)正常工作。

为什么会这样?有没有办法正确读取所有数据?

编辑

fp 定义如下:

FILE* fp;
_wfopen_s(&fp, L"C://somedata.dat", L"rb");

这个方框字符(十六进制)是 0x06 后跟 0x00。
数据定义为: char *data = new char[m_sizeOfData];

编辑 2

我还注意到另一个文件的末尾加载了一些垃圾。垃圾看起来像:

ýýýý«««««««««îþ

这是因为它试图完成一定的字节数吗?

4

3 回答 3

1

你怎么知道它停在你说的地方?如果您只是使用字符串函数查看结果,那么这些字符串函数将全部停在第一个空字符处 - 实际数据可能会扩展得更远。

于 2009-10-09T03:43:25.290 回答
1

您以错误的方式使用 fread 的计数/大小参数。由于您正在读取字节,因此第二个参数应该是 1,第三个参数应该是计数:

fread(data, 1, m_sizeOfData, fp);

然后,您可以使用 fread 的返回值来确定读取了多少字节。如果您得到返回的预期计数,那么您可以放心地阅读所有您想要的数据。在这种情况下,您可能错误地输出了数据 - 如果您将其视为以 NUL 结尾的字符串,那么您看到的 0x00 将是打印内容的结尾。0x06 可能是框字形。

于 2009-10-09T06:30:40.820 回答
0

如果你在 Windows 上,我认为有一些像 ctrl-Z 或 ctrl-D 这样的字符可以表示文件结束,除非你专门以二进制模式打开文件

于 2009-10-09T03:47:42.760 回答