C++ 通过使用指向igzstreams的指针的STL向量读取gzip文件
作为输入,我有一个gzip文件列表。如图所示,我使用gzstream来处理它们。出于实际原因,我希望打开每个文件并将每个流记录到一个向量中。这看起来很简单,但我没能成功。以下是最低限度的代码: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}
#包括
#包括
#包括
使用名称空间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;i cerr这是错误的;您存储了指向流的指针向量,但您使用指向流的本地作用域自动实例(在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];
}