home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_08_07 / 8n07129a < prev    next >
Text File  |  1990-06-19  |  3KB  |  116 lines

  1.   1: /* 
  2.   2:  *  MDBFBIN.C
  3.   3:  *
  4.   4:  *  Program:  Mini-Database
  5.   5:  *  Written by: Leor Zolman
  6.   6:  *  Module:   File I/O, Binary
  7.   7:  *            Representation Version
  8.   8:  */
  9.   9: 
  10.  10: #include <stdio.h>
  11.  11: #include <stdlib.h>
  12.  12: #include "mdb.h"
  13.  13: 
  14.  14: /*
  15.  15:  * Function:    read_db
  16.  16:  * Purpose:     Load an existing Database from disk
  17.  17:  * Parameters:    Name of Database to load
  18.  18:  * Return Value:  NULL on error, else # of records.
  19.  19:  */
  20.  20: 
  21.  21: int read_db(char *filename)
  22.  22: {
  23.  23:   FILE *fp;
  24.  24:   int nrecs, result;
  25.  25:   struct record recbuf;
  26.  26: 
  27.  27: #if DYN_ARRAY
  28.  28:   int array_size;
  29.  29: #endif
  30.  30:   
  31.  31:   if ((fp = fopen(filename, "rb")) == NULL)
  32.  32:   {
  33.  33:     printf("Database not found.\n");
  34.  34:     return 0;
  35.  35:   }
  36.  36: 
  37.  37: #if DYN_ARRAY     /* Allocating array space dynamically   */
  38.  38:   fseek(fp, 0L, 2);     /*    skip to end of data   */
  39.  39:   nrecs = ftell(fp) / sizeof(struct record);  /* # of recs  */
  40.  40:   max_recs = nrecs + MAX_TO_ADD;  /* allow MAX_TO_ADD more  */
  41.  41:   array_size = max_recs * sizeof(struct record *);
  42.  42:                     /* allocate the memory  */
  43.  43:   if ((recs = malloc(array_size)) == NULL)
  44.  44:   {
  45.  45:     printf("Couldn't allocate recs array; aborting.\n");
  46.  46:     return NULL;
  47.  47:   }
  48.  48:   fseek(fp, 0L, 0);     /* reset to beginning of data */
  49.  49: #else
  50.  50:   max_recs = MAX_RECS;
  51.  51: #endif
  52.  52:   
  53.  53:   for (nrecs = 0; ;nrecs++)
  54.  54:   {
  55.  55:     result = fread(&recbuf, sizeof(struct record), 1, fp);
  56.  56: 
  57.  57:     if (result == 0)              /* EOF */
  58.  58:       break;
  59.  59: 
  60.  60:     if (ferror(fp))
  61.  61:       error("Error on file input. Aborting.\n");
  62.  62: 
  63.  63:     if ((RECS[nrecs] = alloc_rec()) == NULL)
  64.  64:       error("Out of memory. Aborting.\n");
  65.  65: 
  66.  66:     *RECS[nrecs] = recbuf;    /* Copy the record  */
  67.  67:   }
  68.  68: 
  69.  69:   fclose(fp);
  70.  70:   return nrecs;
  71.  71: }
  72.  72: 
  73.  73: 
  74.  74: /*
  75.  75:  * Function:    write_db
  76.  76:  * Purpose:     Write current Database to disk
  77.  77:  * Parameters:    Name of Database
  78.  78:  * Return Value:  None
  79.  79:  */
  80.  80: 
  81.  81: void write_db(char *filename)
  82.  82: {
  83.  83:   FILE *fp;
  84.  84:   char *tempname = "TEMPFILE";
  85.  85:   int result, i;
  86.  86:   
  87.  87:   if ((fp = fopen(tempname, "wb")) == NULL)
  88.  88:   {
  89.  89:     printf("Can't open Database file for reading.\n");
  90.  90:     return;
  91.  91:   }
  92.  92:   
  93.  93:   printf("Writing Database %s To Disk...\n", filename);
  94.  94: 
  95.  95:   for (i = 0; i < n_recs; i++)
  96.  96:     if (fwrite(RECS[i], sizeof(struct record),
  97.  97:                   1, fp) != 1)
  98.  98:     {
  99.  99:       printf("Error writing file. Aborting attempt.\n");
  100. 100:       fclose(fp);
  101. 101:       remove(tempname);
  102. 102:       return;
  103. 103:     }
  104. 104: 
  105. 105:   fclose(fp);
  106. 106:   remove(filename);
  107. 107:   while (rename(tempname, filename) == -1)
  108. 108:   {
  109. 109:     printf("Error renaming temp file: %s\n",
  110. 110:               _strerror(NULL));
  111. 111:     printf("Please enter a new filename: ");
  112. 112:     gets(filename);
  113. 113:   }
  114. 114:   printf("Database written successfully.\n");
  115. 115: }
  116.