gpt4 book ai didi

c++ - 用于 C++ 的 gzstream 库 : corrupted file created

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:08 26 4
gpt4 key购买 nike

我想用我的 C++ 脚本读写压缩文件。为此,我使用 gzstream 库。它适用于像这样一个非常简单的例子:

string inFile="/path/inputfile.gz";
igzstream inputfile;
ogzstream outputfile("/path/outputfile.gz");
inputfile.open(inFile.c_str());

// Writing from input file to output file
string line;
while(getline(inputfile, line)) {
outputfile << line << endl;
}

但在我的 C++ 脚本中,事情要复杂得多,我的输出文件是在动态 vector 中创建的。

对于未压缩的文件,这种方式非常有效:

string inFile="/path/uncompressedInputFile.ext";
ifstream inputfile;
vector <ofstream *> outfiles(1);
string outputfile="/path/uncompressedOutputFile.ext";
outfiles[1] = new ofstream(outputfile.c_str());

inputfile.open(inFile.c_str());
string line;
while(getline(inputfile, line)) {
*outfiles[1] << line << endl;
}

现在使用压缩文件,这种方式会产生损坏的文件:

string inFile="/path/compressedFile.gz";
igzstream inputfile;
vector <ogzstream *> outfiles(1);
string outputfile="/path/compressedOutputFile.gz";
outfiles[1] = new ogzstream(outputfile.c_str());

inputfile.open(inFile.c_str());
string line;
while(getline(inputfile, line)) {
*outfiles[1] << line << endl;
}

我的路径中有一个“compressedOutputFile.gz”,不是空的,但是在尝试解压缩它时我得到了“意外的文件结尾”,我猜这意味着文件已损坏....它出什么问题了 ?谁能帮帮我吗 ?! :)

最佳答案

在这个简单的示例中,当 ofstream 被销毁时,GZip 文件会自动关闭,这会将其剩余缓冲区刷新到磁盘。

在动态示例中,您没有关闭,因为对象是在堆上创建的。在这两种情况下,这都可能导致文件末尾的数据丢失,具体取决于格式。由于 GZip 是压缩的,因此更有可能丢失更多相关数据,从而导致更明显的故障。

最好的解决方案是创建一个 vector<unique_ptr<ogzstream> > ,这会导致它在超出范围时自动销毁流。不太理想的解决方案是记住在退出函数之前手动删除每个指针。

编辑:作为快速说明,正如@doctorlove 在原始评论中指出的那样,您需要使用正确的索引,否则会导致其他问题。

关于c++ - 用于 C++ 的 gzstream 库 : corrupted file created,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19665744/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com