C# 自定义存档格式文件读取

C# 自定义存档格式文件读取,c#,c++,file,visual-c++,C#,C++,File,Visual C++,C#.NET 4.0 在读取自定义文件归档格式时,我遇到了一个有趣的问题。在C#中,我编写了一个程序,创建了一个存档头(关于整个存档的一些开销信息、文件数量等等)。然后,它接收一个要存储的输入文件,读取数据和字节,然后写入有关该文件的一些开销(文件名、类型、大小等),然后写入实际的文件数据。我也可以通过这个程序从档案中提取文件。为了测试它,我存储了一个png图像,并通过从开销中读取文件大小,然后分配一个该大小的字节数组,将文件数据拉入该数组,然后用streamwriter写入来提取它。没什么大不

C#.NET 4.0

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

C++

< >我的C++程序需要读取FILADATIN,确定文件类型,然后将其传递给适当的处理类。处理类给出了错误,这是它们不应该有的。所以我决定在C++程序中使用FWRESE()读取FIDEADA,结果文件被损坏了吗?简而言之,这是用于读取文件的代码

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;
}
无符号字符*data=0;
字符温度=0;
__int64 fileSize=0;
fread(&fileSize,sizeof(\uuuu int64),1,\ufilehandle);
数据=新的无符号字符[文件大小];
对于(_int64 i=0;i
(我现在正在工作,所以我只是凭记忆写了这篇文章。但是,我99%肯定这篇文章对我在家里的代码是准确的。我目前也不关心非MS标准,所以请记住_int64。)

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


我应该以不同的方式来阅读吗?使用fread()读取此数据是否有问题?

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


<> P>由于这个问题是用C++来考虑的,你是否考虑使用IOFROW的规范C++方法而不是一些过时的<代码>文件> /COD>流从C?< /P>中,这有点低效(为什么不<代码> Fad(数据,1,文件化,文件处理)< /COD>而不是循环?),但是看起来不错。但是,您应该检查
fread
中的返回值,以确保它的读数与您要求的读数相同。@Oli Charlesworth我最初是按照您的建议使用fread的,但我改为循环,以查看错误是否发生了变化。不用说,它没有。好吧,描述一下“损坏的”。C++结果是大的、小的,还是只是在某个地方有不同的字节?根据fileSize检查fread()的返回可能会告诉您一些事情。您没有显示_fileHandle是如何创建的。它是否指定了“二进制”?@Henk。文件大小结果是相同的。我真的说不出有什么问题,因为输出和输入看起来是一样的。至于文件句柄的创建,我一时记不起来了。我可能指定了“rb”,但我回家后必须为您再次检查。我回家后会再次检查读取模式。如果这没有任何效果,我会选择iostreams方法。好的,问题是测试编写器没有处于二进制模式…不幸的是,这并不能解决我的处理类不工作的问题。看来我要花一晚上的时间来编码:)