home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / tybc4 / ioerr1.cpp < prev    next >
C/C++ Source or Header  |  1994-01-26  |  5KB  |  213 lines

  1. /*
  2.    C++ program that demonstrates sequential binary file I/O
  3. */
  4.  
  5. #include <iostream.h>
  6. #include <fstream.h>
  7.  
  8. const unsigned MIN_SIZE = 10;
  9. const double BAD_VALUE = -1.0e+30;
  10. enum boolean { false, true };
  11.  
  12. class TErrIO
  13. {};
  14.  
  15. class TErrIndex
  16. {};
  17.  
  18. class Array
  19. {
  20.     protected:
  21.       double *dataPtr;
  22.       unsigned size;
  23.       double badIndex;
  24.       TErrIO ErrIO;
  25.       TErrIndex ErrIndex;
  26.  
  27.     public:
  28.       Array(unsigned Size = MIN_SIZE);
  29.       ~Array()
  30.          { delete [] dataPtr; }
  31.       unsigned getSize() const { return size; }
  32.       double& operator [](unsigned index)
  33.       { return (index < size) ? *(dataPtr + index) : badIndex; }
  34.       void writeElem(fstream& os, unsigned index)
  35.           throw(TErrIO, TErrIndex);
  36.       void readElem(fstream& is, unsigned index)
  37.           throw(TErrIO, TErrIndex);
  38.       void writeArray(const char* filename)
  39.           throw(TErrIO);
  40.       void readArray(const char* filename)
  41.           throw(TErrIO);
  42. };
  43.  
  44. Array::Array(unsigned Size)
  45. {
  46.   size = (Size < MIN_SIZE) ? MIN_SIZE : Size;
  47.   badIndex = BAD_VALUE;
  48.   dataPtr = new double[size];
  49. }
  50.  
  51. void Array::writeElem(fstream& os, unsigned index)
  52.   throw(TErrIO, TErrIndex)
  53. {
  54.     if (index < size) {
  55.       os.write((unsigned char*)(dataPtr + index), sizeof(double));
  56.       if(!os.good())
  57.          throw(ErrIO);
  58.     }
  59.     else
  60.       throw(ErrIndex);
  61. }
  62.  
  63. void Array::readElem(fstream& is, unsigned index)
  64.   throw(TErrIO, TErrIndex)
  65. {
  66.     if (index < size) {
  67.       is.read((unsigned char*)(dataPtr + index), sizeof(double));
  68.       if (!is.good())
  69.          throw(ErrIO);
  70.     }
  71.     else
  72.       throw(ErrIndex);
  73. }
  74.  
  75. void Array::writeArray(const char* filename)
  76.   throw(TErrIO)
  77. {
  78.     fstream f(filename, ios::out | ios::binary);
  79.  
  80.     if (f.fail())
  81.       throw(ErrIO);
  82.     f.write((unsigned char*) &size, sizeof(size));
  83.     f.write((unsigned char*)dataPtr, size * sizeof(double));
  84.     f.close();
  85.     if (!f.good())
  86.       throw(ErrIO);
  87. }
  88.  
  89. void Array::readArray(const char* filename)
  90.   throw(TErrIO)
  91. {
  92.     fstream f(filename, ios::in | ios::binary);
  93.     unsigned sz;
  94.  
  95.     if (f.fail())
  96.       throw(ErrIO);
  97.     f.read((unsigned char*) &sz, sizeof(sz));
  98.     // need to expand the array
  99.     if (sz != size) {
  100.       delete [] dataPtr;
  101.       dataPtr = new double[sz];
  102.       size = sz;
  103.     }
  104.     f.read((unsigned char*)dataPtr, size * sizeof(double));
  105.     f.close();
  106.     if (!f.good())
  107.       throw(ErrIO);
  108. }
  109.  
  110. main()
  111. {
  112.   const unsigned SIZE1 = 10;
  113.   const unsigned SIZE2 = 20;
  114.   char* filename1 = "array1.dat";
  115.   char* filename2 = "array3.dat";
  116.   int hiIndex = 10;
  117.   Array arr1(SIZE1), arr2(SIZE1), arr3(SIZE2);
  118.   fstream f(filename1, ios::out | ios::binary);
  119.  
  120.   // assign values to array arr1
  121.   for (unsigned i = 0; i < arr1.getSize(); i++)
  122.      arr1[i] = 10 * i;
  123.  
  124.   // assign values to array arr3
  125.   for (i = 0; i < SIZE2; i++)
  126.      arr3[i] = i;
  127.  
  128.   cout << "Array arr1 has the following values:\n";
  129.   for (i = 0; i < arr1.getSize(); i++)
  130.      cout << arr1[i] << "  ";
  131.   cout << "\n\n";
  132.  
  133.   try {
  134.      // write elements of array arr1 to the stream
  135.      for (i = 0; i < arr1.getSize(); i++)
  136.         arr1.writeElem(f, i);
  137.   }
  138.   catch(TErrIO e) {
  139.      cout << "Bad stream output\n";
  140.   }
  141.   catch(TErrIndex e) {
  142.      cout << "Error in writing element " << i << "\n";
  143.   }
  144.   f.close();
  145.  
  146.   // reopen the stream for input
  147.   f.open(filename1, ios::in | ios::binary);
  148.  
  149.   try {
  150.      for (i = 0; i < arr1.getSize(); i++)
  151.          arr2.readElem(f, i);
  152.   }
  153.   catch(TErrIO e) {
  154.      cout << "Bad stream output\n";
  155.   }
  156.   catch(TErrIndex e) {
  157.      cout << "Error in writing element " << i << "\n";
  158.   }
  159.   f.close();
  160.  
  161.   // display the elements of array arr2
  162.   cout << "Array arr2 has the following values:\n";
  163.   for (i = 0; i < arr2.getSize(); i++)
  164.      cout << arr2[i] << "  ";
  165.   cout << "\n\n";
  166.  
  167.   // display the elements of array arr3
  168.   cout << "Array arr3 has the following values:\n";
  169.   for (i = 0; i < arr3.getSize(); i++)
  170.      cout << arr3[i] << "  ";
  171.   cout << "\n\n";
  172.  
  173.   // write the array arr3 to file ARRAY3.DAT
  174.   try {
  175.      arr3.writeArray(filename2);
  176.   }
  177.   catch(TErrIO e) {
  178.      cout << "Cannot write the entire array\n";
  179.   }
  180.  
  181.   try {
  182.      // read the array arr1 from file ARRAY3.DAT
  183.      arr1.readArray(filename2);
  184.   }
  185.   catch(TErrIO e) {
  186.      cout << "Cannot read the entire array\n";
  187.   }
  188.  
  189.   // display the elements of array arr1
  190.   cout << "Array arr1 now has the following values:\n";
  191.   for (i = 0; i < arr1.getSize(); i++)
  192.      cout << arr1[i] << "  ";
  193.   cout << "\n\n";
  194.  
  195.   // reopen the stream for input
  196.   f.open(filename1, ios::in | ios::binary);
  197.  
  198.   for (i = 0; i < 3; i++) {
  199.      hiIndex *= 10;
  200.      // attempt to read an element at index hiIndex
  201.      try {
  202.         arr1.readElem(f, hiIndex);
  203.         cout << "Element at index " << hiIndex << " = "
  204.               << arr1[hiIndex] << "\n";
  205.      }
  206.      catch(TErrIndex) {
  207.         cout << "Failed to read element at index "
  208.             << hiIndex << "\n";
  209.      }
  210.   }
  211.   f.close();
  212.   return 0;
  213. }