自定义归档格式文件读取

Posted

技术标签:

【中文标题】自定义归档格式文件读取【英文标题】:Custom archive format File Reading 【发布时间】: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”,但是当我回到家时,我必须为你仔细检查。 【参考方案1】:

鉴于第一个 n 字节似乎是正确的,您是否偶然忘记以二进制模式打开文件 ("rb")?如果您不这样做,那么它有助于将任何\r\n 序列转换为\n,这显然不是您想要的。

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

【讨论】:

我回家后会仔细检查阅读模式。如果这没有任何意义,我将采用 iostreams 方法。 好的,问题是测试编写器不是在二进制模式下......不幸的是,这并不能解决我的处理类不工作的问题。看来我要花一晚上的时间编码了 :)

以上是关于自定义归档格式文件读取的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 C# 序列化来读取自定义格式的二进制文件吗?

创建自定义归档程序?

使用POI读取xlsx文件,包含对excel中自定义时间格式的处理

怎么把压缩文件rar格式转化成csv格式?

对象归档与KVC KVO

对象归档与KVC KVO