home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / tybc4 / io3.cpp < prev    next >
C/C++ Source or Header  |  1993-04-10  |  3KB  |  125 lines

  1. /*
  2.    C++ program that demonstrates random-access binary file I/O
  3. */
  4.  
  5. #include <iostream.h>
  6. #include <fstream.h>
  7. #include <stdlib.h>                
  8. #include <string.h>
  9.  
  10. const unsigned MIN_SIZE = 5;
  11. const unsigned STR_SIZE = 31;
  12. const double BAD_VALUE = -1.0e+30;
  13. enum boolean { false, true };                 
  14.  
  15. class VmArray
  16. {
  17.    protected:
  18.      fstream f;
  19.      unsigned size;
  20.      double badIndex;
  21.  
  22.    public:
  23.      VmArray(unsigned Size, const char* filename);
  24.      ~VmArray()
  25.        { f.close(); }
  26.      unsigned getSize() const
  27.        { return size; }
  28.      boolean writeElem(const char* str, unsigned index);
  29.      boolean readElem(char* str, unsigned index);
  30.      void Combsort();
  31. };
  32.  
  33. VmArray::VmArray(unsigned Size, const char* filename)
  34. {                    
  35.   char s[STR_SIZE+1];
  36.   size = (Size < MIN_SIZE) ? MIN_SIZE : Size;
  37.   badIndex = BAD_VALUE;
  38.   f.open(filename, ios::in | ios::out | ios::binary);
  39.   if (f.good()) {
  40.     // fill the file stream with empty strings
  41.     strcpy(s, "");;
  42.     f.seekg(0);
  43.     for (unsigned i = 0; i < size; i++)
  44.       f.write((unsigned char*)s, sizeof(s));
  45.   }
  46. }
  47.  
  48. boolean VmArray::writeElem(const char* str, unsigned index)
  49. {
  50.    if (index < size) {
  51.      f.seekg(index * (STR_SIZE+1));
  52.      f.write((unsigned char*)str, (STR_SIZE+1));
  53.      return (f.good()) ? true : false;
  54.    }
  55.    else
  56.      return false;
  57. }
  58.  
  59. boolean VmArray::readElem(char* str, unsigned index)
  60. {
  61.    if (index < size) {
  62.      f.seekg(index * (STR_SIZE+1));
  63.      f.read((unsigned char*)str, (STR_SIZE+1));
  64.      return (f.good()) ? true : false;
  65.    }
  66.    else
  67.      return false;
  68. }
  69.  
  70. void VmArray::Combsort()
  71. {
  72.    unsigned i, j, gap = size;
  73.    boolean inOrder;
  74.    char strI[STR_SIZE+1], strJ[STR_SIZE+1];
  75.  
  76.    do {
  77.      gap = (gap * 8) / 11;
  78.      if (gap < 1)
  79.        gap = 1;
  80.      inOrder = true;
  81.      for (i = 0, j = gap; i < (size - gap); i++, j++) {
  82.        readElem(strI, i);
  83.        readElem(strJ, j);
  84.        if (strcmp(strI, strJ) > 0) {
  85.          inOrder = false;
  86.          writeElem(strI, j);
  87.          writeElem(strJ, i);
  88.        }
  89.      }
  90.    } while (!(inOrder && gap == 1));
  91. }
  92.  
  93. main()
  94. {                      
  95.   char* data[] = { "Michigan", "California", "Virginia", "Main",
  96.                    "New York", "Florida", "Nevada", "Alaska",
  97.                    "Ohio", "Maryland" };
  98.   VmArray arr(10, "arr.dat");
  99.   char str[STR_SIZE+1];
  100.   char c;
  101.  
  102.   // assign values to array arr
  103.   for (unsigned i = 0; i < arr.getSize(); i++) {
  104.     strcpy(str, data[i]);
  105.     arr.writeElem(str, i);
  106.   }
  107.   // display unordered array
  108.   cout << "Unsorted arrays is:\n";
  109.   for (i = 0; i < arr.getSize(); i++) {
  110.     arr.readElem(str, i);
  111.     cout << str << "\n";
  112.   }
  113.   // pause
  114.   cout << "\nPress any key and then Return to sort the array...";
  115.   cin >> c;
  116.   // sort the array
  117.   arr.Combsort();
  118.   // display sorted array
  119.   cout << "Sorted arrays is:\n";
  120.   for (i = 0; i < arr.getSize(); i++) {
  121.     arr.readElem(str, i);
  122.     cout << str << "\n";
  123.   }
  124.   return 0;
  125. }