2

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

对于未压缩的文件,这种方式工作得很好:

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

4

1 回答 1

3

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

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

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

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

于 2013-10-29T19:38:58.150 回答