Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::iostreams、gzip文件和tellg_C++_Boost_Gzip_Getline - Fatal编程技术网

C++ boost::iostreams、gzip文件和tellg

C++ boost::iostreams、gzip文件和tellg,c++,boost,gzip,getline,C++,Boost,Gzip,Getline,我一直在使用boost::iostreams读取未压缩的文本文件。在我的应用程序中,我需要多个文件句柄(存储在一个映射中)来有效地缓冲存储在此文件中的不同参数的数据。此外,如果我读取了一行,并且它是用于在我当前感兴趣的时间之后使用的参数,那么我会将流位置(通过tellg())恢复到调用getline())之前的位置,这样我以后仍然可以缓冲该值 不过,我现在希望读取gzip压缩文件,但执行与以前相同的操作。我遇到了以下问题(以前发现过,但解决方案似乎无法满足我的三重需求) 下面是重现这些问题的简短

我一直在使用
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;
}

将克服
tellg()
问题。但是,TEST2显示我无法将解压缩器对象推送到这种类型的过滤器上。我还没有找到解决办法。

根据谷歌上的快速搜索,除非先建立索引,否则无法对gzip文件进行随机访问。有更多的信息,并链接到做这件事的人(特别是zran.c文件)。虽然看起来有点牵连,但我不确定boost是否能帮到你。
boost::iostreams::filtering_stream<boost::iostreams::input_seekable>