home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / c / other / file / records2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-10-25  |  1.9 KB  |  73 lines

  1. /* RECORDS2.C illustrates reading and writing of file records with the
  2.  * following functions:
  3.  *      fgetpos     fsetpos
  4.  *
  5.  * See RECORDS1.C for a version using fseek, rewind, and ftell.
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <io.h>
  10.  
  11. /* File record */
  12. struct RECORD
  13. {
  14.     int     integer;
  15.     long    doubleword;
  16.     double  realnum;
  17. } filerec = { 0, 1, 10000000.0 };
  18.  
  19. main()
  20. {
  21.     int c, newrec;
  22.     size_t recsize = sizeof( filerec );
  23.     FILE *recstream;
  24.     fpos_t *recpos;
  25.  
  26.     /* Create and open temporary file. */
  27.     recstream = tmpfile();
  28.  
  29.     /* Write 10 unique records to file. */
  30.     for( c = 0; c < 10; c++ )
  31.     {
  32.         ++filerec.integer;
  33.         filerec.doubleword *= 3;
  34.         filerec.realnum /= (c + 1);
  35.  
  36.         fwrite( &filerec, recsize, 1, recstream );
  37.     }
  38.  
  39.     /* Find a specified record. */
  40.     do
  41.     {
  42.         printf( "Enter record betweeen 1 and 10 (or 0 to quit): " );
  43.         scanf( "%d", &newrec );
  44.  
  45.         /* Find and display valid records. */
  46.         if( (newrec >= 1) && (newrec <= 10) )
  47.         {
  48.             *recpos = (fpos_t)((newrec - 1) * recsize);
  49.             fsetpos( recstream, recpos );
  50.             fread( &filerec, recsize, 1, recstream );
  51.  
  52.             printf( "Integer:\t%d\n", filerec.integer );
  53.             printf( "Doubleword:\t%ld\n", filerec.doubleword );
  54.             printf( "Real number:\t%.2f\n", filerec.realnum );
  55.         }
  56.     } while( newrec );
  57.  
  58.     /* Starting at first record, scan each for specific value. */
  59.     *recpos = (fpos_t)0;
  60.     fsetpos( recstream, recpos );
  61.     do
  62.     {
  63.         fread( &filerec, recsize, 1, recstream );
  64.     } while( filerec.doubleword < 1000L );
  65.  
  66.     fgetpos( recstream, recpos );
  67.     printf( "\nFirst doubleword above 1000 is %ld in record %d\n",
  68.             filerec.doubleword, *recpos / recsize );
  69.  
  70.     /* Close and delete temporary file. */
  71.     rmtmp();
  72. }
  73.