如果我尝试将未压缩的filtering_istream复制到stringstream,则会崩溃

时间:2011-01-17 21:07:59

标签: c++ segmentation-fault gzip boost-iostreams

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

这是我尝试过的代码:

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有关。

你能给我一个错误(/是)吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

经过大量的研究和尝试后,我终于找到了一种如何正确处理(de)压缩的方法。

这是适用于我的代码,没有任何问题(使用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* );甚至会失败。

我希望这段代码可以帮助我,因为它帮助了我。

保罗:)