如何创建ifstream对象数组,如何使用带编号的文本文件填充该数组?

aha*_*bos 4 c++ io file ifstream

我在目录中有一堆文本文件,每个文本文件名为"info1.txt","info2.txt"等等.如何打开ifstream对象数组中的所有文本文件,而不必硬编码我的所有文本文件名?我知道以下代码不起作用,但我认为它传达了我想要做的想法,如果它确实有效:

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

我知道解决方案可能很简单,但经过大量的研究,试验和错误,我仍然没有想到它.谢谢!

Mr.*_*C64 6

为了构建文件名,我使用std::ostringstream和operator<<.

如果你想使用一个容器类一样std::vector(例如,因为你不知道在编译时有多少大的阵列ifstream的必应),因为std::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() ) );        
}
Run Code Online (Sandbox Code Playgroud)

用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) );
}
Run Code Online (Sandbox Code Playgroud)

unqiue_ptr效率更高shared_ptr,因为unique_ptr它只是一个可移动的指针,它不是引用计数(因此开销少于shared_ptr).所以,在C++ 11,你可能要喜欢unique_ptr当ifstream的不是外面共享vector容器.


Som*_*ude 5

问题是,我想,关于动态创建文件名的部分.

其中一个简单的解决方案是使用std::ostringstream它:

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

如果你的库是旧的,它接受std::string调用中的参数open然后使用

    myFiles[i].open(filename.str().c_str());
Run Code Online (Sandbox Code Playgroud)