C++ 通过使用指向igzstreams的指针的STL向量读取gzip文件

C++ 通过使用指向igzstreams的指针的STL向量读取gzip文件,c++,gzip,C++,Gzip,作为输入,我有一个gzip文件列表。如图所示,我使用gzstream来处理它们。出于实际原因,我希望打开每个文件并将每个流记录到一个向量中。这看起来很简单,但我没能成功。以下是最低限度的代码: #包括 #包括 #包括 使用名称空间std; #包括 int main(int argc,字符**argv) { 尺寸i; 矢量文件; 矢量流; 弦线; //创建虚拟输入文件 系统(“rm-f infle*.gz;用于{1..2}中的i;do echo\'toto\'${i}|gzip>infle${i}

作为输入,我有一个gzip文件列表。如图所示,我使用gzstream来处理它们。出于实际原因,我希望打开每个文件并将每个流记录到一个向量中。这看起来很简单,但我没能成功。以下是最低限度的代码:

#包括
#包括
#包括
使用名称空间std;
#包括
int main(int argc,字符**argv)
{
尺寸i;
矢量文件;
矢量流;
弦线;
//创建虚拟输入文件
系统(“rm-f infle*.gz;用于{1..2}中的i;do echo\'toto\'${i}|gzip>infle${i}.gz;完成”);
vInFiles.push_back(“infile1.gz”);
vInFiles.push_back(“infile2.gz”);
//打开每个输入文件
对于(i=0;icerr这是错误的;您存储了指向流的指针向量,但您使用指向流的本地作用域自动实例(在for循环内)的指针对其进行初始化。一旦循环的每个迭代完成,该实例就超出了作用域,并且您有一个指向某个垃圾的指针

然后你用这些废话,然后把废话拿出来

使用智能指针,例如

  std::vector<boost::shared_ptr<igzstream> > vStreams;
  // to initialize
  for (i = 0; i < vInFiles.size(); ++i)
  {
    boost::shared_ptr<igzstream> inStream(new igzstream(vInFiles[i].c_str());
    if (!inStream->good())
    {
      cerr << "ERROR: can't open file " << vInFiles[i] << endl;
      exit (1);
    }
    vStreams.push_back (inStream); // save the smart pointer
  }
std::向量vStreams;
//初始化
对于(i=0;igood())
{

cerr迭代结束后,您的流指针无效,因为自动流对象将被销毁。如果确实需要,您需要在免费存储区上分配它们(或使
igzstream
可移动)

//C++03的std::vector
std::矢量流;
// ...
对于(size_t i=0;i打开(…);
// ...
vStreams.推回(河道内);
}
// ...

如评论中所述,我不希望使用Boost,我只有gcc 4.1.2。因此,以下是使用的解决方案,感谢Cat Plus的建议:

  // open each input file
  for (i = 0; i < vInFiles.size(); ++i)
  {
    igzstream * pt_inStream = new igzstream;
    pt_inStream->open (vInFiles[i].c_str());
    if (! pt_inStream->good())
    {
      cerr << "ERROR: can't open file " << vInFiles[i] << endl;
      exit (1);
    }
    vStreams.push_back (pt_inStream);
  }
//打开每个输入文件
对于(i=0;iopen(vInFiles[i].c_str());
如果(!pt_inStream->good())
{

cerr直列vStreams.push_-back(和流内);您将指向流的指针推到第一个for循环的作用域中,该流是自动的和本地对象。每次迭代的每次退出都会销毁流对象,留下指向不存在对象的悬空指针。感谢您的提示,我不知道这一点。但我现在不想使用Boost。感谢您的回答。因为我只知道拥有GCC4.1.2(不使用-std=c++0x编译),我不会使用
unique\u ptr
。相反,我会使用
new
delete
为我的流对象在免费存储中分配它们。我会添加我自己的答案。@woolhill:你应该使用
shared\u ptr
。在gcc 4.1.2中,你可以使用boost::scoped\u ptr,这与c++11 unique\u ptr基本相同。你可以在上找到boost库。
  std::vector<boost::shared_ptr<igzstream> > vStreams;
  // to initialize
  for (i = 0; i < vInFiles.size(); ++i)
  {
    boost::shared_ptr<igzstream> inStream(new igzstream(vInFiles[i].c_str());
    if (!inStream->good())
    {
      cerr << "ERROR: can't open file " << vInFiles[i] << endl;
      exit (1);
    }
    vStreams.push_back (inStream); // save the smart pointer
  }
// std::vector<boost::shared_ptr<igzstream>> for C++03 
std::vector<std::unique_ptr<igzstream>> vStreams;

// ...

for (size_t i = 0; i < vInFiles.size(); ++i) {
    // boost::shared_ptr<igzstream> inStream = boost::make_shared<igzstream>();
    auto inStream = std::unique_ptr<igzstream>(new igzstream);
    inStream->open(...);
    // ...
    vStreams.push_back(inStream);
}

// ...
  // open each input file
  for (i = 0; i < vInFiles.size(); ++i)
  {
    igzstream * pt_inStream = new igzstream;
    pt_inStream->open (vInFiles[i].c_str());
    if (! pt_inStream->good())
    {
      cerr << "ERROR: can't open file " << vInFiles[i] << endl;
      exit (1);
    }
    vStreams.push_back (pt_inStream);
  }
  // close each input file                                                                                                                                                                                                                                           
  for (i = 0; i < vInFiles.size(); ++i)
  {
    vStreams[i]->close();
    delete vStreams[i];
  }