用于C ++的gzstream lib:已创建损坏的文件

时间:2013-10-29 17:57:26

标签: c++ compression

我想用C ++脚本读写压缩文件。为此,我使用gzstream lib。它运行良好,有一个非常简单的例子:

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 ++脚本中,事情变得更复杂,我的输出文件是在动态矢量中创建的。

对于UN压缩文件,这种方式非常好用:

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”,而不是空的,但是当我尝试解压缩时,我得到了“意外的文件结束”,我猜,这意味着该文件已损坏.... 它出什么问题了 ?谁能帮帮我吗 ?! :)

1 个答案:

答案 0 :(得分:3)

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

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

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

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