自定义存档格式文件读取

本文关键字:文件 读取 格式 自定义 | 更新日期: 2023-09-27 18:09:11

C#.NET 4.0

我在阅读自定义文件归档格式时遇到了一个有趣的问题。在C#中,我编写了一个程序,创建了一个归档头(关于整个归档的一些开销信息、文件数量等(。然后,它需要存储一个输入文件,读取和字节,然后写一些关于文件的开销(文件名、类型、大小等(,然后写实际的文件数据。我也可以通过这个程序从档案中提取文件。为了测试它,我存储了一个png图像,并通过从开销中读取文件大小来提取它,然后分配一个该大小的字节数组,将文件数据拉入该数组,然后用streamwriter写入。没什么大不了的,做得很好。现在,我们转到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。(

我还没有检查所有的30多个字节来确定是否所有的东西都是一致的,但我看到的前20个左右的字节似乎是正确的。我不明白为什么会有问题。fread((有什么好笑的地方吗?我还仔细检查了档案中的文件,消除了所有档案开销,并用记事本将图像数据保存到一个新的png图像中,效果很好。

我应该以不同的方式阅读吗?使用fread((读取这些数据有问题吗?

自定义存档格式文件读取

假设第一个n字节似乎是正确的,您是否偶然忘记以二进制模式("rb"(打开文件?如果你不这样做,那么将'r'n的任何序列转换为'n对你来说都很有帮助,这显然不是你想要的。

由于这个问题被标记为C++,您是否考虑使用iostreams的规范C++方法,而不是使用C中有些过时的FILE*流?