//  Listing 6 - Functions to write records 
//  (See Listing 3 for the class definition)

//  =============================================
//  For a file opened in Append or Recreate modes this
//      appends new records to the end of the file.
//  For a file opened in Update or AnyWrite modes this
//	rewrites the current record.
//
int binaryfile::filewrite () { 
    int ret;
    if (mode == Readonly) return -2;  // Error trap
    if (mode == Update || mode == AnyWrite) {
       return filewrite (recnbr); // rewrite current record
    }
    if ((ret = write (handle, record, length)) != -1) {
       recnbr = (share == WriteShared ? countrecords() : (count += 1L));
    }
    return ret;
}

//  =============================================
//  Function to write out a specific record in class
//      binaryfile.  This function can only be used if
//      the file was opened in Update or AnyWrite modes.
//  To append to a file (AnyWrite mode only) use any 
//      very large record number
//
int binaryfile::filewrite (long number) { 
    int ret;
    if ((mode != Update && mode != AnyWrite) || 
	number <= 0 ||
        (mode == Update && number > count)) 
	return -2;  // Parameter error trap
    if (number > count) number = countrecords() + 1;
    if (number != locked && share == WriteShared) {
       if (lockrecord (number)) return -10;
    }
    lseek (handle, ((number - 1) * length) + header, SEEK_SET);
    if ((ret = write (handle, record, length)) != -1L &&
       number > count) count += 1L; // new record at end of file
    unlockrecord ();
    recnbr = number;
    return ret;
}
