use*_*268 5 c++ boost gzip getline
我一直用于boost::iostreams
读取未压缩的文本文件。在我的应用程序中,我需要多个文件句柄(存储在映射中)来有效缓冲存储在该文件中的不同参数的数据。另外,如果我读取一行并且它是在比我当前感兴趣的时间晚使用的参数,我会将流位置(通过恢复tellg()
)恢复到我调用之前的位置getline()
),所以我仍然可以缓冲未来某个时间的这个值。
但是,我现在希望读取 gzip 压缩文件,但执行与以前相同的操作。我遇到了以下问题(之前发现过,但该解决方案似乎不适用于我的三重要求)。
main()
重现这些问题的简短测试如下:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <boost/shared_ptr.hpp>// shared_ptr
#include <boost/iostreams/filtering_stream.hpp>// filtering_[io]stream
#include <boost/iostreams/filter/gzip.hpp>// gzip
//-----------------------------------------------------------------------------
int main( int argc, char** argv ){
std::cout << std::scientific << std::setprecision(15) << std::endl;
std::string fileName("test.txt.gz");
bool gzipped(true);
std::string line;
// TEST 1
boost::shared_ptr<std::ifstream> fileStream1;
boost::shared_ptr<boost::iostreams::filtering_istream> fileFilter1;
fileFilter1.reset( new boost::iostreams::filtering_istream );
fileStream1.reset( new std::ifstream( fileName.c_str() ) );
if(gzipped)
fileFilter1->push( boost::iostreams::gzip_decompressor() );
fileFilter1->push( *fileStream1 );
while( std::getline( *fileFilter1, line ) ){
//std::streampos strPos( fileFilter1->tellg() );// uncomment this line for run-time errors
std::cout << line << std::endl;
}
std::cout << std::endl;
// TEST 2
boost::shared_ptr<std::ifstream> fileStream2;
boost::shared_ptr<boost::iostreams::filtering_stream<boost::iostreams::input_seekable> > fileFilter2;
fileFilter2.reset( new boost::iostreams::filtering_stream<boost::iostreams::input_seekable>() );
fileStream2.reset( new std::ifstream( fileName.c_str() ) );
//fileFilter2->push( boost::iostreams::gzip_decompressor() );// uncomment this line for compile-time errors
fileFilter2->push( *fileStream2 );
while( std::getline( *fileFilter2, line ) ){
std::streampos strPos( fileFilter2->tellg() );
std::cout << line << std::endl;
}
std::cout << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,输入文件显然可以包含您喜欢的任何内容。只需确保它有 >1 行文本即可查看tellg()
问题。
在 TEST1 中,我只能想象错误是由tellg()
的哨兵创建和failbit
修改(http://www.cplusplus.com/reference/istream/istream/sentry/)引起的,正如这篇文章所建议的:https:// svn.boost.org/trac/boost/ticket/2449)。
boost::iostreams::filtering_stream<boost::iostreams::input_seekable>
Run Code Online (Sandbox Code Playgroud)
将克服这个tellg()
问题。但是,TEST2 显示我无法将解压缩器对象推送到这种类型的过滤器上。我还没有找到解决这个问题的方法。
归档时间: |
|
查看次数: |
1950 次 |
最近记录: |