0

我想解压缩文件并将其内容写入字符串流。

这是我试过的代码:

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. 所以我不确定压缩是否正常工作,以及这是否与gzip errorBoost.

你能告诉我错误在哪里吗?

谢谢你的帮助!

保罗

4

1 回答 1

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;
    }
}

我能说的是我犯了一些不必要的错误,我只是在几个小时后再次查看代码才发现的。boost::iostreams::copy( std::stringstream , char* );例如,如果 1 + 1 为 3,甚至会失败。

我希望这段代码能帮助别人,因为它帮助了我。

保罗:)

于 2011-01-18T20:53:44.990 回答