Nyhoff, ADTs, Data Structures and Problem Solving with C++, Second Edition, 
© 2005 Pearson Education, Inc. All rights reserved. 0-13-140909-3 

 

 

Figure 5-1 Demonstration of file I/O

/*--------------------------------------------------------------------------
   Read numeric data stored in a file, compute the minimum, maximum, and
   average of the numbers, and write these statistics to an output file.
 
   Input(keyboard): names of the input and output files
   Input(file):     a sequence of numeric values
   Output(file):    a count of the values, the minimum value,
                     the maximum value, and the average value
--------------------------------------------------------------------------*/

#include <iostream>                   // cin, cout
#include <fstream>                    // ifstream, ofstream
#include <string>                     // string, getline()
#include <cassert>                    // assert()
#include <cfloat>                     // DBL_MIN and DBL_MAX
using namespace std;

int main()
{
   cout << "This program computes the number, maximum, minimum, and\n"
           "average of an input list of numbers in one file,\n"
           "and places its results in another file.\n\n";

   // ----------- Input Section -----------------------------------

   cout << "Enter the name of the input file: ";
   string inputFileName;
   getline(cin, inputFileName);           // get name of input file
                                          // open an input stream 
   ifstream fin;                          //  to the input file,
   fin.open(inputFileName.data());        //  establish a connection,
   assert( fin.is_open() );               //  and check for success

   int count = 0;                         // number of values
   double reading,                        // value being processed
          maximum = DBL_MIN,              // largest seen so far
          minimum = DBL_MAX,              // smallest seen so far
          sum = 0.0;                      // running total 

   for (;;)                               // loop:
   {
      fin >> reading;                     //  read a value from file

      if ( fin.eof() ) break;             //  if eof, quit

      count++;                            //  update: count,
      sum += reading;                     //          sum,
      if (reading < minimum)    
         minimum = reading;               //          minimum,
      if (reading > maximum)
         maximum = reading;               //          maximum
   }                                      // end loop

   fin.close();                           // close the connection

   // ------------ Output Section ---------------------------------

   cout << "Enter the name of the output file: ";
   string outputFileName;
   getline(cin, outputFileName);
                                          // open an output stream
   ofstream fout(outputFileName.data());  //  to the output file,
                                          //  establish a connection,
   assert( fout.is_open() );              //  and check for success
                                          // write results to file
   fout << "\n--> There were " << count << " values";

   if (count > 0)
      fout << "\n    ranging from " << minimum
                << " to " << maximum
                << "\n    and their average is " << sum / count
                << endl;

   fout.close();                       // close the stream

   cout << "Processing complete.\n";
} 

 

 

Figure 5.2 String Stream Demo

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cassert>
#include <sstream>
using namespace std;

int main()
{
   string date = "U.S. independence:  July 4, 1776";

   istringstream istr(date);

   string word1, word2, month;
   int day, year;
   char comma;

   istr >> word1 >> word2 >> month >> day >> comma >> year;
   cout << "Contents of string stream istr, one word per line:\n"
        << word1 << '\n' << word2 << '\n' << month << '\n' 
        << day << comma << '\n' << year << '\n' << endl;

   const int Y2K = 1999;
   ofstream outfile("file5-2.out");
   assert(outfile.is_open());

   ostringstream ostr;

   ostr << word1 << "bicentennial: " << month 
        << setw(2) << day << ", " << year + 200 << endl;
   
   cout <<  "Contents of string stream ostr:\n" << ostr.str();
   outfile << ostr.str();
} 

 

 

Figure 5.3A Text Editor Declaration

/*-- TextEditor.h ---------------------------------------------------------
 
  This header file defines the data type TextEditor for editing text files.
  Basic operations are:
     Constructor:  Construct a TextEditor object for given files
     run()         Run the editor
     showMenu():   Display the menu of editing "hot keys"
     insert():     Insert a string in a line of text
     erase():      Remove a string from a line of text
     replace():    Replace a string by another string in a line of text
     next():       Output edited line and get next line to edit
     quit():       Wrap up editing
 -------------------------------------------------------------------------*/

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

class TextEditor
{
 public:
  /******** Function Members ********/
  TextEditor(string inputFile, string outputFile);
  /*----------------------------------------------------------------------
    Construct a text editor for files named inputFile and outputFile.

    Precondition:  inputFile is the file to be edited.
    Postcondition: outputFile contains the edited text.
    ----------------------------------------------------------------------*/ 
 
  void run();
  /*----------------------------------------------------------------------
    Run the editor.

    Precondition:  None.
    Postcondition: Text from inputFile has been edited and output to 
        outputFile.
  ----------------------------------------------------------------------*/ 

  void showMenu();
  /*----------------------------------------------------------------------
    Display menu of editing commands.

    Precondition:  None.
    Postcondition: Menu has been output to cout.
    ----------------------------------------------------------------------*/ 
 
  void insert(string str1, string str2);
  /*----------------------------------------------------------------------
    Insert a string into a line of text.

    Precondition:  None.
    Postcondition: str1 has been inserted before str2 in myLine if 
        str2 is found in myLine; otherwise, myLine is unchanged.
  ----------------------------------------------------------------------*/ 

  void erase(string str);
  /*----------------------------------------------------------------------
    Remove a string from a line of text.

    Preconditions: None.
    Postcondition: str has been removed from myLine if str is found 
        in myLine; otherwise, myLine is unchanged.
  ----------------------------------------------------------------------*/ 

  void replace(string str1, string str2);
  /*----------------------------------------------------------------------
    Replace one string with another in a line of text.

    Precondition:  None.
    Postcondition: str1 has been replaced with str2 in myLine if str1 
        is found in myLine; otherwise, myLine is unchanged.
  -----------------------------------------------------------------------*/ 

  void next();
  /*----------------------------------------------------------------------
    Move on to next line of text to edit.

    Precondition:  None.
    Postcondition: String that was in myLine has been output to 
        myOutstream and a new line read from myInstream into myLine.
   ----------------------------------------------------------------------*/ 

  void quit();
  /*----------------------------------------------------------------------
    Quit editing.

    Precondition:  None.
    Postcondition: String that was in myLine has been output to
        outputFile and any lines remaining in inputFile have been
        copied to outputFile.
   ----------------------------------------------------------------------*/ 

 private:
  /******** Data Members ********/
  ifstream myInstream;
  ofstream myOutstream;
  string myLine;
}; 

 

 

Figure 5.3B Text Editor Definitions

/*-- TextEditor.cpp -------------------------------------------------------

   Contains definitions of the function members of class TextEditor.
 -------------------------------------------------------------------------*/

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

#include "TextEditor.h"

//--- Utility function to eat spaces from cin
void eatBlanks()
{
  char blank;
  while (cin.peek() == ' ')
    cin.get(blank);
}

//--- Definition of constructor
TextEditor::TextEditor(string inputFile, string outputFile)
{
  myInstream.open(inputFile.data());
  myOutstream.open(outputFile.data());
  if (!myInstream.is_open() || !myOutstream.is_open())
  {
    cerr << "Error in opening files.";
    exit(-1);
  }
}

//--- Definition of run()
void TextEditor::run()
{
  showMenu();
  cout << "Enter an editing command following each prompt >\n\n";
  getline(myInstream, myLine);
  cout << "TEXT: "  << myLine << endl;
  char command;
  string str1, str2;
  for (;;)
  {
    if (myInstream.eof()) break;
    cout << '>';
    cin >> command; 
    cin.ignore(1, '\n');
    switch(toupper(command))
    {
      case 'I' : eatBlanks();
                 getline(cin, str1);
                 cout << "Insert before what string? "; 
                 getline(cin, str2);
                 insert(str1, str2);
                 break;
      case 'D' : eatBlanks();
                 getline(cin, str1);
                 erase(str1);
                 break;
      case 'R' : eatBlanks();
                 getline(cin, str1);
                 cout << "With what? "; 
                 getline(cin, str2);
                 replace(str1, str2);
                 break;
      case 'N' : next();
                 break;
      case 'Q' : quit();
                 break;
      default :  cout << "\n*** Illegal command ***\n";
                 showMenu();
                 cout << "TEXT:" << myLine << endl;
    }// end of switch

    if (!myInstream.eof())
      cout << "TEXT: " << myLine << endl;
  }
  cout << "\n*** Editing complete ***\n";
}

//--- Definition of showMenu
void TextEditor::showMenu()
{
  cout << "Editing commands are:\n"
          "  I str: Insert string str before another string\n"
          "  D str:   Delete string str\n"
          "  R str:   Replace string str with another string\n"
          "  N :      Get next line of text\n"
          "  Q :      Quit editing\n";
}

//--- Definition of insert()
void TextEditor::insert(string str1, string str2)
{
  int position = myLine.find(str2);
  if (position != string::npos)
    myLine.insert(position, str1);
  else
    cout << str2 << " not found\n";
}

//--- Definition of erase()
void TextEditor::erase(string str)
{
  int position = myLine.find(str);
  if (position != string::npos)
    myLine.erase(position, str.length());
  else
    cout << str << " not found\n";
}

//--- Definition of replace()
void TextEditor::replace(string str1, string str2)
{
  int position = myLine.find(str1);
  if (position != string::npos)
    myLine.replace(position, str1.length(), str2);
  else
    cout << str1 << " not found\n";
}

//--- Definition of next()
void TextEditor::next()
{
  myOutstream << myLine << endl;
  getline(myInstream, myLine);
  cout << "\nNext line:\n";
}

//--- Definition of quit()
void TextEditor::quit()
{
  myOutstream << myLine << endl;
  for (;;)
  {
    getline(myInstream, myLine);
    if (myInstream.eof()) break;
    myOutstream << myLine << endl;
  }
} 

 

 

 

Figure 5.3C Text Editor Driver Program

/*-- Fig4-3.cpp -----------------------------------------------------------
  Driver program for TextEditor class.  It gets the name of a file to
  be edited from the user, appends ".out" for the output file, builds
  a TextEditor object editor for these files, and sends it the run()
  message.
 -------------------------------------------------------------------------*/

#include <iostream>
#include <string>
using namespace std;

#include "TextEditor.h"
int main()
{
  string inFileName,
         outFileName;
  cout << "Enter the name of the input file: ";
  getline(cin, inFileName);
  outFileName = inFileName +".out";
  cout << "The output file is " << outFileName << "\n\n";
  TextEditor editor(inFileName, outFileName);
  editor.run();
} 

 

 

 

 

Figure

 

 

 

 

Figure

 

 

 

 

Figure

 

 

 

 

Figure

 

 

 

 

Figure

 

 

 

 

Figure

 

 

 

 

Figure

 

 

 

 

Figure

 

 

 

 

Figure

 

 

 

 

Figure

 

 

 

 

Figure

 

 

 

 

Figure

 

 

 

 

Figure

 

 

 

 

Figure