【发布时间】:2011-09-20 14:14:07
【问题描述】:
C#.NET 4.0
我在阅读自定义文件存档格式时遇到了一个有趣的问题。在 C# 中,我编写了一个程序来创建存档头(有关整个存档的一些开销信息、文件数量等)。然后它需要一个输入文件被存储、读取和字节,然后写入一些关于文件的开销(文件名、类型、大小等),然后是实际的文件数据。我也可以通过这个程序从档案中提取文件。为了测试它,我存储了一个 png 图像并通过从开销中读取文件大小然后分配该大小的字节数组来提取它,将文件数据拉入该数组,然后使用流写入器将其写入。没什么大不了的,工作正常。现在,我们去 C++ 方面...
C++
我的 C++ 程序需要读取文件数据,确定文件类型,然后将其传递给适当的处理类。处理类给出了错误,这是他们不应该的。所以我决定在使用 fwrite() 读取文件数据后从 C++ 程序中写入文件数据,结果文件似乎已损坏?简而言之,这是用于读取文件的代码...
unsigned char * data = 0;
char temp = 0;
__int64 fileSize = 0;
fread(&fileSize, sizeof(__int64), 1, _fileHandle);
data = new unsigned char[fileSize];
for (__int64 i = 0; i < fileSize; i++)
{
fread(&temp, 1, 1, _fileHandle);
data[i] = temp;
}
(我现在正在工作,所以我只是凭记忆写的。但是,我 99% 肯定它对我在家的代码是准确的。目前我也不关心非 MS 标准,所以请忍受__int64。)
我还没有检查所有 300 个几千字节来确定一切是否一致,但我查看的前 20 个左右字节似乎是正确的。我不完全明白为什么会出现问题。 fread() 有什么好笑的吗?我还仔细检查了存档中的文件,删除了所有存档开销,并使用记事本将图像数据保存到新的 png 图像中,效果很好。
我应该以不同的方式阅读这篇文章吗?使用 fread() 读取这些数据有什么问题吗?
【问题讨论】:
-
好吧,这有点低效(为什么不是
fread(data, 1, fileSize, _fileHandle)而不是循环?),但看起来还可以。但是,您应该检查来自fread的返回值,以确保它确实按照您的要求读取。 -
@Oli Charlesworth 我最初使用 fread 您的建议,但我改为循环查看错误是否完全改变。不用说,它没有。
-
好的,描述“损坏”。 C++ 结果是更大、更小,还是只是在某个地方有不同的字节?根据 fileSize 检查 fread() 的返回可能会告诉你一些事情。
-
您没有显示 _fileHandle 是如何创建的。它是否指定“二进制”?
-
@Henk。文件大小结果是相同的。我真的不知道什么是损坏的,因为输出看起来与输入相同。至于你的 _fileHandle 创建,我不记得了..我可能指定了“rb”,但是当我回到家时,我必须为你仔细检查。
标签: c# c++ file visual-c++