如何创建一个ifstream对象的数组,以及如何使用编号的文本文件填充该数组

How do I create an array of ifstream objects and how can I populate that array with numbered text files?

本文关键字:数组 何使用 文本 填充 文件 编号 对象 创建 何创建 ifstream 一个      更新时间:2023-10-16

我在目录中有一堆文本文件,每个文本文件命名为" info1.txt"," info2.txt"等。我如何在不需要硬编码所有文本文件名中的ifstream对象中打开所有文本文件?我知道以下代码不起作用,但我认为它可以传达我想做什么的想法:

ifstream myFiles[5];
for(int i = 0; i < 5; i++){
    myFiles[i].open("info" + i + ".txt");
}

我知道该解决方案可能非常简单,但是经过大量的研究,反复试验,我仍然没有弄清楚它。谢谢!

用于构建文件名,我将使用std::ostringstreamoperator<<

如果要使用std::vector之类的容器类(例如,因为您不知道ifstream的数组是多少)您不能使用vector<ifstream>,但是可以使用vector<shared_ptr<ifstream>>vector<unique_ptr<ifstream>>;例如:

vector<shared_ptr<ifstream>> myFiles;
for (int i = 0; i < count; i++)
{
    ostringstream filename;
    filename << "info" << i << ".txt";
    myFiles.push_back( make_shared<ifstream>( filename.str() ) );        
}

使用unique_ptr(和C 11移动语义):

vector<unique_ptr<ifstream>> myFiles;
for (int i = 0; i < count; i++)
{
    ostringstream filename;
    filename << "info" << i << ".txt";
    unique_ptr<ifstream> file( new ifstream(filename.str()) );
    myFiles.push_back( move(file) );
}

unqiue_ptrshared_ptr更有效,因为unique_ptr只是可移动指针,因此没有参考计数(因此,比shared_ptr的开销要少)。因此,在C 11中,如果ifstream'S在vector容器之外没有共享。

,您可能需要更喜欢unique_ptr

问题是,我猜是动态创建文件名的部分。

简单的解决方案之一是使用std::ostringstream进行操作:

ifstream myFiles[5];
for(int i = 0; i < 5; i++){
    ostringstream filename;
    filename << "info" << i ".txt";
    myFiles[i].open(filename.str());
}

如果您的库是旧的,以便接受std::string open中的CC_18参数,然后使用

    myFiles[i].open(filename.str().c_str());

您的想法应该与一个小的更改一起使用:

myFiles[i].open((std::string("info") + itoa(i) + ".txt").c_str());
             // ^^^^^^^^^^^           ^^^^

还要注意,您不能使用std::vector,因为ifstream不是可复制的对象。因此,继续使用数组。

我通常使用std :: stringstream:

{
  std::stringstream filename;
  filename << "info" << i << ".txt" << std::ends;
  myFiles[i].open(filename.str().c_str());
}

您可以拥有一系列的ifstream对象,但是如果您需要动态长度,则不能以这种方式执行std::vector<ifstream>工作。

因此您需要指针。std::vector<ifstream*>可以工作,但您可以使用shared_ptr,因此std::vector<shared_ptr<ifstream> >将起作用。如果您有可用的unique_ptr,则可以使用它代替shared_ptr

然后必须使用new创建每个元素。

您还需要正确创建字符串,您可以使用boost::formatostringstream甚至老式的sprintf来做到这一点。

顺便说一句,我会搜索Boost的文件系统库,以查看它们是否具有更动态的ifstream,可以在您的向量中愉快地进行,而无需共享_ptr的混乱