Listing 14 Navigates a file of fixed-length records

// records.cpp: Illustrate file positioning
#include <iostream.h>
#include <fstream.h>
#include <strstream.h>
#include <stddef.h>

struct record
{
   char last[16];
   char first[11];
   int age;
};

main()
{
   const size_t BUFSIZ = 81;
   int nrecs = 0;
   char buf[BUFSIZ];
   struct record recbuf;
   int mode = ios::bin | ios::trunc | ios::out | ios::in;
   fstream f("recs.dat",mode);

   for(;;)
   {
      // Prompt for input line
      cout << "Enter LAST,FIRST,AGE: ";
      if (!cin.getline(buf,BUFSIZ))
          break;

      // Extract fields
      istrstream line(buf);
      line.getline((char *)&recbuf.last,sizeof recbuf.last,',');
      line.getline((char *)&recbuf.first,sizeof recbuf.first,',');
      line >> recbuf.age;

      // Write to file
      f.write((char *) &recbuf, sizeof recbuf);
      ++nrecs;
   }

   /* Position at last record */
   f.seekg((nrecs-1)*sizeof(struct record),ios::beg);
   if (f.read((char *) &recbuf,sizeof recbuf))
      cout<< "last: "<< recbuf.last
         << ", first: ' << recbuf.first
         << ", age: ' << recbuf.age
         << endl;

   /* Position at first record */
   f.seekg(0,ios::beg);
   if (f.read({char *) &recbuf,sizeof recbuf))
      cout << "last: " << recbuf.last
          << ", first: ' << recbuf.first
          << ", age: " << recbuf.age
          << end1;
   
   return 0;
}

// Sample execution
// Enter LAST,FIRST,AGE: Lincoln,Abraham,188
// Enter LAST,FIRST,AGE: Bach,Johann,267
// Enter LAST,FIRST,AGE: Tze,Lao,3120
// Enter LAST,FIRST,AGE: ^Z
// last: Tze, first: Lao, age: 3120
// last: Lincoln, first: Abraham, age: 188

// End of File