c++inputstdinifstream

Reading from text file or stdin


I have a program that basically reads a text file and counts the number of occurrences of each word on each line. Everything works properly when reading from a text file using an ifstream, however, if a file name is not entered on the command line, I need to read from stdin instead.

I use the following to open and read in the file currently:

map<string, map<int,int>,compare> tokens;
ifstream text;
string line;
int count = 1;

if (argc > 1){
    try{
        text.open(argv[1]);
    }
    catch (runtime_error& x){
        cerr << x.what() << '\n';
    }

    // Read file one line at a time, replacing non-desired char's with spaces
    while (getline(text, line)){
        replace_if(line.begin(), line.end(), my_predicate, ' ');

        istringstream iss(line);    
        // Parse line on white space, storing values into tokens map
        while (iss >> line){                
            ++tokens[line][count];
        }
        ++count;
    }
}

else{
while (cin) {
    getline(cin, line);
    replace_if(line.begin(), line.end(), my_predicate, ' ');

    istringstream iss(line);
    // Parse line on white space, storing values into tokens map
    while (iss >> line){
        ++tokens[line][count];
    }
    ++count;
}

Is there a way to assign cin to an ifstream and simply add an else statement if argc > 1 fails, using the same code afterwards instead of duplicating like this? I haven't been able to find a way to do this.


Solution

  • Make the reading part a function of its own. Pass either an ifstream or cin to it.

    void readData(std::istream& in)
    {
       // Do the necessary work to read the data.
    }
    
    int main(int argc, char** argv)
    {
       if ( argc > 1 )
       {
          // The input file has been passed in the command line.
          // Read the data from it.
          std::ifstream ifile(argv[1]);
          if ( ifile )
          {
             readData(ifile);
          }
          else
          {
             // Deal with error condition
          }
       }
       else
       {
          // No input file has been passed in the command line.
          // Read the data from stdin (std::cin).
          readData(std::cin);
       }
    
       // Do the needful to process the data.
    }