我想解压缩文件并将其内容写入字符串流。
这是我尝试过的代码:
string readGZipLog () {
try {
using namespace boost::iostreams;
ifstream file(currentFile.c_str(), std::ios_base::in | std::ios_base::binary);
boost::iostreams::filtering_istream in;
in.push(gzip_decompressor());
in.push(file);
std::stringstream strstream;
boost::iostreams::copy(in, strstream);
return strstream.str();
} catch (std::exception& e) {
cout << e.what() << endl;
}
}
void writeGZipLog (char* data) {
try {
using namespace boost::iostreams;
std::ofstream file( currentFile.c_str(), std::ios_base::out | std::ios_base::binary );
boost::iostreams::filtering_ostream out;
out.push( gzip_compressor() );
out.push(file);
std::stringstream strstream;
strstream << data;
boost::iostreams::copy( strstream, data );
} catch (std::exception& e) {
cout << e.what() << endl;
}
}
它编译时没有任何警告(当然也有错误)但是函数readGZipLog()
在运行时崩溃:
gzip error
./build: line 3: 22174 Segmentation fault ./test
./build
是自动编译和启动应用程序./test
的脚本
我检查了文件:它包含一些内容,但我无法使用gunzip
对其进行解压缩。所以我不确定压缩是否正常工作,以及这是否与Boost抛出的gzip error
有关。
你能给我一个错误(/是)吗?
感谢您的帮助!
保
答案 0 :(得分:2)
这是适用于我的代码,没有任何问题(使用gzip和bzip2):
string readGZipLog () {
using namespace boost::iostreams;
using namespace std;
try {
ifstream file(currentFile.c_str(), ios_base::in | ios_base::binary);
boost::iostreams::filtering_istream in;
in.push(gzip_decompressor());
in.push(file);
stringstream strstream;
boost::iostreams::copy(in, strstream);
return strstream.str();
} catch (const gzip_error& exception) {
cout << "Boost Description of Error: " << exception.what() << endl;
return "err";
}
}
bool writeGZipLog (char* data) {
using namespace boost::iostreams;
using namespace std;
try {
std::ofstream file( currentFile.c_str(), std::ios_base::app );
boost::iostreams::filtering_ostream out;
out.push( gzip_compressor() );
out.push(file);
stringstream strstream;
strstream << data;
boost::iostreams::copy(strstream, out);
return true;
} catch (const gzip_error& exception) {
cout << "Boost Description of Error: " << exception.what() << endl;
return false;
}
}
我可以说的是,我做了一些不必要的错误,我只是在几个小时后再次查看代码时才发现。例如,如果1 + 1为3,boost::iostreams::copy( std::stringstream , char* );
甚至会失败。
我希望这段代码可以帮助我,因为它帮助了我。
保罗:)