2009-10-09 78 views
0

我正在使用C++中的FILE对象读取二进制文件的碎片。这里是fseek和相应的fread调用:fread以null值终止中间读取。同时在垃圾中读取预期数据

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

m_sizeOfData结束是一个大于400的整数。看起来,它应该从二进制文件读取全部40万个字节的数据(顺便说一下,它是一个char [m_sizeOfData]),但是它在一个unicode字符上大约6或7个字符后停止,它看起来像一个盒子。我在想这可能代表无效终止?我对此并不积极。对于我正在阅读的每一个文件,情况并非如此。大多数人似乎都能正常工作(通常)。

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

编辑

FP被定义为这样:

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

该框字符,十六进制,是0×06,随后为0x00。数据的定义方式如下:char * data = new char [m_sizeOfData];

编辑2

我也注意到,另一个文件是有一些垃圾装到它的结束。垃圾的样子:

YYYY««««««««ITH

这是因为它试图完成字节一定回合数?

+0

fread返回什么值?即:如果你说'size_t num_read = fread(...);'在这之后是什么num_read? – 2009-10-09 03:46:26

+0

num_read返回1 – Chris 2009-10-09 03:47:36

+0

垃圾可能是未初始化的内存。检查camh的答案。 – 2009-10-09 14:33:25

回答

1

您正在使用的计数二进制模式的文件/ fread大小参数错误的方式。既然你正在阅读的字节,第二个参数应该是1,第三个参数的计数:

fread(data, 1, m_sizeOfData, fp); 

然后可以使用的fread的返回值来确定多少字节读取。如果您得到预期的返回计数,那么您可以很舒服地看到您正在读取所需的所有数据。在这种情况下,您可能输出的数据不正确 - 如果您将其视为NUL终止的字符串,则您看到的0x00将是打印内容的结尾。 0x06可能是盒子字形。

+0

感谢您的回复。这产生相同的结果。我想有可能在VS中的调试器中的“值”字段null终止字符串,但我仍然从它的错误。我注意到另一块被加载的东西在它的末尾有一些垃圾(ýýý«««««««þ).. – Chris 2009-10-09 13:29:47

+0

我想强调这个答案的一部分,“使用返回值fread“ - 这会告诉你从文件中读取了多少字节。不要相信任何过去的事情。 – 2009-10-09 14:32:28

1

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

+0

我正在检查调用fread后直接从调试器传入char *的数据。 – Chris 2009-10-09 03:45:22

+0

那你能告诉我们这个“盒子”角色的十六进制等值吗?你怎么知道数据在那里停止? – 2009-10-09 03:52:37

+0

你如何检查它? – 2009-10-09 03:54:24

0

如果您使用的是Windows,我觉得有一些字符,像CTRL-Z或Ctrl-d,可以表示文件的末尾,除非你专门开辟

+0

FILE * fp; _wfopen_s(&fp,L“C://myfile.dat”,L“rb”);这是打开它在二进制模式,正确的? – Chris 2009-10-09 03:50:19

+0

是的b是二进制的。你可以在十六进制编辑器中查看文件吗? – 2009-10-09 03:52:18

+0

我可以在记事本中查看文件,虽然我没有十六进制编辑器。 – Chris 2009-10-09 03:53:06