Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I have a bunch of text files in a directory, and each text file is named "info1.txt", "info2.txt" and so on. How would I open up all of the text files in an array of ifstream objects without having to hard-code all my text file names in? I know the following code does not work, but I think it conveys the idea of what I want to do if it did work:

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

I know the solution is probably very simple, but after a lot of research, trial and error I still haven't figured it out. Thanks!

like image 393
ahabos Avatar asked Dec 05 '22 14:12

ahabos


1 Answers

For building the file names, I'd use std::ostringstream and operator<<.

If you want to use a container class like std::vector (e.g. because you don't know at compile time how much big the array of ifstream's will be), since std::ifstream is not copyable, you can't use vector<ifstream>, but you can use vector<shared_ptr<ifstream>> or vector<unique_ptr<ifstream>>; e.g.:

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() ) );        
}

With unique_ptr (and C++11 move semantics):

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_ptr is more efficient than shared_ptr, since unique_ptr is just a movable pointer, it's not reference counted (so there is less overhead than shared_ptr). So, in C++11, you may want to prefer unique_ptr if the ifstream's are not shared outside the vector container.

like image 105
Mr.C64 Avatar answered Dec 09 '22 15:12

Mr.C64