Search code examples
c++filestdinistream-iterator

Using istream_iterator and reading from standard input or file


I'm writing in Microsoft Visual C++ and I'd like my program to either read from standard input or a file using the istream_iterator. Googling the internets hasn't shown how simple I think it must be. So for example, I can write this pretty easily and read from standard input:

#include <iostream>
#include <string>
#include <iterator>

using namespace std;

int main()
{
   istream_iterator<string> my_it(cin);
   for (; my_it != istream_iterator<string>(); my_it++)
      printf("%s\n", (*my_it).c_str());
}

Or I can write this and read from a file:

#include <iostream>
#include <string>
#include <iterator>
#include <fstream>

using namespace std;

int main(int argc, char** argv)
{
   ifstream file(argv[1]);
   istream_iterator<string> my_it(file);
   for (; my_it != istream_iterator<string>(); my_it++)
      printf("%s\n", (*my_it).c_str());
}

But how do I combine these two so that a simple (argc == 2) check lets me initialize my input stream iterator with either a file stream or stdin and go on about my merry way?


Solution

  • You can assign to the iterator after constructing it:

    int main(int argc, char** argv)
    {
       ifstream file;
       istream_iterator<string> my_it;
    
       if(argc == 2) {
          file.open(argv[1]);
          my_it = istream_iterator<string>(file);
       } else {
          my_it = istream_iterator<string>(cin);
       }
    }