C#.NET 4.0
我在阅读自定义文件存档格式时遇到了一个有趣的问题。在C#中,我编写了一个程序来创建一个归档标题(一些关于整个存档的开销信息,文件数量,这些类型的东西)。然后它将输入文件存储,读取和字节,然后写入一些关于文件(文件名,类型,大小等)的开销,然后写入实际的文件数据。我也可以通过这个程序从档案中提取文件。为了测试它,我存储了一个png图像并通过从开销中读取文件大小来提取它,然后分配该大小的字节数组,将filedata拉入该数组,然后用一个streamwriter编写它。没什么大不了的,工作得很好。现在,我们转到C ++方面......
C ++
我的C ++程序需要读取filedata,确定文件类型,然后将其传递给相应的处理类。处理类给出了错误,他们不应该有错误。所以我决定在使用fwrite()读取后从C ++程序中写出filedata,结果文件似乎被损坏了?简而言之,这是用于读取文件的代码......
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()读取这些数据有什么问题吗?
答案 0 :(得分:2)
鉴于第一个n
字节似乎是正确的,您是不是偶然忘记以二进制模式打开文件("rb"
)?如果您没有,那么它会帮助您将\r\n
的任何序列转换为\n
,这显然不是您想要的。
由于这个问题被标记为C ++你是否考虑过使用iostreams的规范C ++方法而不是来自C的有点过时的FILE*
流?