繁体   English   中英

fread以空值终止中读取。 还读入垃圾过去的预期数据

[英]fread terminating mid-read at null values. Also reading in garbage past expected data

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

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

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

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

编辑

fp的定义如下:

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

此框字符(以十六进制表示)是0x06,后跟0x00。
数据定义为:char * data = new char [m_sizeOfData];

编辑2

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

YYYY««««««««ITH

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

您怎么知道它停止了您所说的话? 如果仅使用字符串函数查看结果,那么这些字符串函数都将在第一个空字符处停止-实际数据可能会扩展得更远。

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

fread(data, 1, m_sizeOfData, fp);

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

如果您在Windows上,我认为有些字符,例如ctrl-Z或ctrl-D可以表示文件结尾,除非您专门以二进制模式打开文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM