home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9202 / borhot / cincoutd.cpp < prev    next >
C/C++ Source or Header  |  1992-01-06  |  5KB  |  200 lines

  1. /* ------------------------------------------------------ */
  2. /*                   CINCOUTD.CPP                         */
  3. /*              Redirecting CIN or COUT                   */
  4. /*            (c) 1990 Borland International              */
  5. /*                 All rights reserved.                   */
  6. /* ------------------------------------------------------ */
  7. /*  veröffentlicht in: DOS toolbox 2'92                   */
  8. /* ------------------------------------------------------ */
  9.  
  10. /*
  11.   In the following program, the input with CIN can be
  12.   redirected to gather the data from a file, or the output
  13.   with COUT can be redirected to a file or stdprn depending
  14.   on the program's command line arguments.
  15. */
  16.  
  17. #include <fstream.h>
  18. #include <iostream.h>
  19. #include <io.h>
  20. #include <fcntl.h>
  21. #include <process.h>
  22. #include <string.h>
  23. #include <sys\stat.h>
  24.  
  25. #define  PRNHANDLE  4
  26. #define  ARRAYSIZE  80
  27.  
  28. void OutputUsage(void);
  29. int  OpenOutFile(char *);
  30. int  OpenInFile(char *);
  31.  
  32. int main(int argc, char *argv[])
  33. {
  34.   char      io = 0;       // Keeps track if CIN or COUT
  35.                           // redirection
  36.   filebuf   *fBuf;        // Filebuf created with stdprn
  37.                           // filehandle
  38.   streambuf *oldBuf;      // Used to hold the old streambuf
  39.                           // while CIN or COUT is being
  40.                           // redirected
  41.   unsigned  fhndl = -1;   // File handle of redirected file
  42.  
  43.   char      a[ARRAYSIZE + 1];   // Used for the sample I/O
  44.  
  45.   if (argc != 2) {
  46.     switch(argv[1][0]) {        // Check the second command
  47.                                 // argument
  48.  
  49.     // Redirect CIN to gather from file specified at
  50.     // command line
  51.       case 'I':
  52.       case 'i':
  53.  
  54.     // Capture CIN's current streambuf before it is
  55.     // reassigned
  56.         oldBuf = cin.rdbuf();
  57.         io     = 'i';
  58.  
  59.     // Opens file specified at command line and redirects
  60.     // CIN to extract from it
  61.         fhndl = OpenInFile(argv[2]);
  62.         break;
  63.  
  64.     // Redirect COUT to output to file specified
  65.     // at the command line
  66.       case 'O':
  67.       case 'o':
  68.  
  69.     // Capture COUT's streambuf before new
  70.     // streambuf * is assigned.
  71.         oldBuf = cout.rdbuf();
  72.         io     = 'o';
  73.  
  74.     // Opens file specified at command line and
  75.     // redirects output via COUT to file
  76.         fhndl = OpenOutFile( argv[2] );
  77.         break;
  78.  
  79.     // Redirect COUT to stdprn
  80.       case 'P':
  81.       case 'p':
  82.  
  83.     // Create a new filebuf with the file handle to stdprn
  84.         fBuf = new filebuf(PRNHANDLE);
  85.  
  86.     // Use overloaded assignment operator to assign
  87.     // new filebuf to COUT
  88.         cout = fBuf;
  89.         break;
  90.       default:
  91.  
  92.     // If no command line arguments specified, use
  93.     // default settings for CIN and COUT
  94.         if (argc == 1) {
  95.           break;
  96.         }
  97.     // Output command line usage if 2nd command
  98.     // line argument incorrect
  99.         OutputUsage();
  100.       }
  101.     }
  102.  
  103.     // NOW NORMAL USE OF CIN AND COUT WILL HONOR ANY
  104.     // REDIRECTION DONE ABOVE
  105.  
  106.     // Simple demonstration of CIN inserting characters
  107.     // into array 'a'
  108.     cin.getline(a, ARRAYSIZE);
  109.  
  110.     // Check to make sure the previous function call did
  111.     // not produce errors
  112.     if (cin.fail()) {
  113.       return 1;
  114.     }
  115.  
  116.     // Simple demonstration of COUT outputting contents
  117.     // of 'a' to output stream
  118.     cout << a << endl;
  119.  
  120.     // If a file was opened for redirection, close that file
  121.     if (fhndl != -1) {
  122.       close(fhndl);
  123.  
  124.     // Reassign the old streambuf * to either CIN or COUT
  125.       if (io == 'i') {
  126.         cin = oldBuf;
  127.       }
  128.       else if (io == 'o') {
  129.         cout = oldBuf;
  130.       }
  131.     // NOW CIN AND COUT HAVE BEEN SET TO ORIGINAL STATE
  132.     }
  133.   return 0;
  134. }
  135.  
  136. int OpenOutFile(char *filename) {
  137.   filebuf *tmpFBuf;
  138.   int     fhndl;
  139.  
  140.   fhndl = open(filename, O_CREAT|O_TEXT|O_RDWR,
  141.                          S_IREAD|S_IWRITE);
  142.   if (fhndl == -1) {
  143.     cout << "Error opening file " << filename
  144.          << ", program terminated.";
  145.     cout << endl;
  146.     exit(1);
  147.   }
  148.  
  149.   // Create new filebuf with file handle of file specified
  150.   // at command line
  151.   tmpFBuf = new filebuf(fhndl);
  152.  
  153.   // Use overloaded assignment operator to assign new
  154.   // filebuf to COUT
  155.   cout = tmpFBuf;
  156.   return fhndl;
  157. }
  158.  
  159. int OpenInFile(char *filename) {
  160.   filebuf *tmpFBuf;
  161.   int     fhndl;
  162.  
  163.   fhndl = open(filename, O_CREAT|O_TEXT|O_RDONLY,
  164.                          S_IREAD|S_IWRITE );
  165.   if (fhndl == -1) {
  166.     cout << "Error opening file " << filename
  167.          << ", program terminated.";
  168.     cout << endl;
  169.     exit(1);
  170.   }
  171.  
  172.   // Create new filebuf with file handle of file specified
  173.   // at command line
  174.   tmpFBuf = new filebuf(fhndl);
  175.  
  176.   // Use overloaded assignment operator to assign new
  177.   // filebuf to CIN
  178.   cin = tmpFBuf;
  179.   return fhndl;
  180. }
  181.  
  182. void OutputUsage( void ) {
  183.   cout << endl
  184.        << "Usage: <exe filename> [I, O, ?, h] <filename>"
  185.        << endl;
  186.   cout <<
  187.   "I - cin will be redirected to input from  <filename>."
  188.        << endl;
  189.   cout <<
  190.   "O - cout will be redirected to output to <filename>."
  191.        << endl;
  192.   cout <<
  193.   "P - cout will be redirected to output to stdprn."
  194.        << endl;
  195.   cout << "? or h - Outputs this screen." << endl;
  196. }
  197. /* ------------------------------------------------------ */
  198. /*                Ende von CINCOUTD.CPP                   */
  199.  
  200.