My version of the original with the binary file I/O, minus the menu and other things

by (Login rpgfan3233)

 
Compile with g++ or from the Visual C++/Windows SDK command prompt:

g++ -o recs.exe main.cc recs.cc
(or)
cl /EHsc /Ferecs.exe /TP main.cc recs.cc


main.cc:

#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <vector> 
#include "recs.hh" 
using namespace std; 

int
main (void) 

  // A generic I/O file stream. 
  fstream f; 

  // A vector to hold all of the sales records. 
  vector<SalesRecord> SalesRecs (0); 

  cout << "Employee Sales Records\n" << endl; 
  cout << "\nLoading records..." << endl; 

  // Open the records file, storing the stream information in `f', 
  // and resize the vector if the file was read successfully. 
  { 
    vector<SalesRecord>::size_type nRecords 
      = OpenRecords (f, "SalesRecords.txt"); 
    if (nRecords == static_cast<vector<SalesRecord>::size_type> (-1)) 
      { 
        cerr << "Could not create records file.  Exiting..." 
             << endl; 
        return 1; 
      } 
    else if (nRecords == static_cast<vector<SalesRecord>::size_type> (-2)) 
      { 
        cerr << "Records file created, but unable to be opened. " 
             << "Exiting..." << endl; 
        return 1; 
      } 
    SalesRecs.resize (nRecords); 
  } 

  // Read the file and output its contents. 
  for (vector<SalesRecord>::iterator recit = SalesRecs.begin(); 
       recit != SalesRecs.end(); 
       ++recit) 
    { 
      f.read (reinterpret_cast<char *> (&*recit), sizeof (*recit)); 
      for (size_t i = 0; 
           i < sizeof (recit->items) / sizeof (*recit->items); 
           ++i) 
        { 
          cout << recit->items[i] << "\t"; 
        } 
      cout << endl; 
    } 

  // Close the record file and exit. 
  f.close (); 
  return 0; 



recs.cc:

#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <cstdlib> 
#include <ctime> 
#include "recs.hh" 
using namespace std; 

vector<SalesRecord>::size_type 
OpenRecords (fstream &f, const char *filename) 

  // The variable that holds our return value. 
  vector<SalesRecord>::size_type nrecs = 0; 
   
  // We can't open a file if one is already open! 
  if (f.is_open ()) 
    { 
      f.close (); 
    } 
   
  f.open (filename, ios::in | ios::binary); 
  if (!f.good ()) 
    { 
      SalesRecord rec; 
      const int MAX_SALES = 65535, MIN_SALES = 0; 
       
      clog << ("\n Record file not found. " 
               "Creating dummy data file...\n") << endl; 

      f.clear (); 
      f.open (filename, ios::out | ios::binary); 

      if (!f.good ()) 
        { 
          return static_cast<vector<SalesRecord>::size_type> (-1); 
        } 

      srand (static_cast<unsigned int> (time (0))); 

      for (int TotalRec = 0; TotalRec <= 29; ++TotalRec) 
        { 
          for (size_t i = 0; i < sizeof (rec.items) / sizeof (*rec.items); ++i) 
            { 
              rec.items[i] = rand () % MAX_SALES + MIN_SALES; 
              cerr << rec.items[i] << "\t"; 
            } 
          f.write ((char *) &rec, sizeof (rec)); 
          cerr << endl; 
        } 
      f.close (); 
      f.open (filename, ios::in | ios::binary); 
      if (!f.good ()) 
        { 
          return static_cast<vector<SalesRecord>::size_type> (-2); 
        } 
    } 
  else 
    { 
      clog << "\n Opened record file successfully" << endl; 
    } 
  f.seekg (0, ios::end); 

  // Note: tellg() returns the number of BYTES.  As a result, we must 
  // divide by the number of BYTES allocated to the `items' array of a 
  // `SalesRecord' structure. 
  nrecs = f.tellg () / sizeof (SalesRecord::items); 
  f.seekg (0, ios::beg); 
  f.clear (); 
  return nrecs; 



recs.hh:

#ifndef RECS_HH 
#define RECS_HH 1 

#include <iosfwd> 
#include <vector> 

// Using ``using namespace std;'' in header files is generally 
// considered bad practice. Therefore it isn't done here. 

struct SalesRecord 

  int items[5]; 
}; 

std::vector<SalesRecord>::size_type 
OpenRecords (std::fstream &infile, const char *filename); 

#endif /* not RECS_HH */



    
This message has been edited by rpgfan3233 on May 8, 2011 3:46 PM
This message has been edited by rpgfan3233 on May 8, 2011 10:09 AM
This message has been edited by rpgfan3233 on May 8, 2011 10:00 AM
This message has been edited by rpgfan3233 on May 8, 2011 9:57 AM
This message has been edited by rpgfan3233 on May 8, 2011 9:50 AM

Posted on May 8, 2011, 7:35 AM

Respond to this message   

Return to Index

 Copyright © 1999-2014 Network54. All rights reserved.   Terms of Use   Privacy Statement