Listing 4 Functions to Open and Close Files

//  (See Listing 3 for the class definition)

//  =============================================
//  Function to open a file for class binaryfile
//
int binaryfile::fileopen (const char *n, enum FILEMODE m,
      long h, enum SHAREMODE s) {
   if (isopen() || !*n || record == NULL) return -2; // Error

//  The O_type and S_type flags are defined in <sys\stat.h>
//  The SH_type flags are Turbo C sharing flags from <share.h>
   unsigned access = O_BINARY |
      (m == Readonly ? O_RDONLY : O_RDWR) |    // read/write access
      (s == WriteShared ? SH_DENYNONE :        // file sharing
        (s == ReadShared ? SH_DENYWR : SH_DENYRW));
   if (m == Append || m == Recreate) access |= O_APPEND;

   handle = (m != Recreate ? open (n, access) :
      open (n, access | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE));
   if (handle < 0) return handle;  // trap error

// set values into elements in the object
   mode = m;
   header = h;
   recnbr = locked = 0L;
   strncpy (name, n, 80); name[80] = '\0';
   share = s;
   countrecords();
   return 0;   // successful open
}

//  =============================================
//  Function to close a file for class binaryfile
//
int binaryfile::fileclose () {
   int ret;
   if (!isopen()) return 0; // already closed
   if (locked > 0L) unlockrecord();
   if ((ret = close (handle)) == 0) handle = -1;
   return ret;
}

//  =============================================
//  Function to change the record length in
//    class binaryfile
//
int binaryfile::changelength (unsigned len) {
   void *ptr;
   if (isopen() || !len || len > 4096) return -2; // Error
   if ((ptr = realloc (record, len)) == NULL) return -1;
   record = (char*) ptr; length = len;
   return 0;
}

//  =============================================
//  Function to count the records in class binaryfile
//
long binaryfile::countrecords() {
   return (count = (lseek (handle, 0, SEEK_END) - header) / length);
};

// End of File