### Associating a File with a Standard Input or Output Stream

The iostream_withassign class lets you associate a stream object with one of the predefined streams cin, cout, cerr, and clog. You can do this, for example, to write programs that accept input from a file if a file is specified, or from standard input if no file is specified.

The following program is a simple filter that reads input from a file into a character array, and writes the array out to a second file. If only one file is specified on the command line, the output is sent to standard output. If no file is specified, the input is taken from standard input. The program uses the iostream_withassign assignment operator to assign an ifstream or ofstream object to one of the predefined streams.

    //  Generic I/O Stream filter, invoked as follows:
    //  filter [infile [outfile] ]

    #include <iostream.h>
    #include <fstream.h>

    void main(int argc, char* argv[]) {
       ifstream* infile;
       ofstream* outfile;
       char inputline[4096];               // used to read input lines
       int sinl=sizeof(inputline);         // used by getline() function
       if (argc>1) {                // if at least an input file was specified
          infile = new ifstream(argv[1]);  // try opening it
          if (infile->good())              // if it opens successfully
             cin = *infile;                // assign input file to cin

             if (argc>2) {          // if an output file was also specified
                outfile = new ofstream(argv[2]); // try opening it
                if (outfile->good())       // if it opens successfully
                   cout = *outfile;        // assign output file to cout
                }
             }

          cin.getline(inputline,
          sizeof(inputline),'\n');         // get first line
          while (cin.good()) {             // while input is good
          //
          // Insert any line-by-line filtering here
          //
          cout << inputline << endl;        // write line
          cin.getline(inputline,sinl,'\n'); // get next line (sinl specifies
          }                                 // max chars to read)
          if (argc>1) {                     // if input file was used
             infile->close();               // then close it
             if (argc>2) {                  // if output file was used
                outfile->close();           // then close it
                }
             }
          }

You can use this example as a starting point for writing a text filter that scans a file line by line, makes changes to certain lines, and writes all lines to an output file.