290______________________________Часть II. Программирование на C++
В листинге 12.10 продемонстрированы зачатки действительно произвольного доступа. Номер каждой записи в файле рассчитывается на основе размера записи и текущего положения файлового указателя. Например, если длина записи равна 24 байтам, а текущая позиция равна 0 (начало файла), то номер записи может быть вычислен следующим образом:
RECORD NUMBER = POSITION / RECORD SIZE RECORD NUMBER =0/24 RECORD NUMBER = 0
Это справедливо для записей любых размеров и для любых положений файлового указателя. Чтобы узнать позицию записи внутри файла, следует умножить ее номер на размер отдельной записи. Номера записей всегда должны начинаться с нуля, поскольку о, умноженный на любой размер, остается нулем, т. е. началом файла. В листинге 12.10 приведен пример произвольного доступа к файлу, в котором смещение записи относительно начала файла вычисляется по размеру структуры и номеру записи.
ftinclude <stdio.h>
#include <stdlib.h> ftinclude <conio.h>
#include <string.h>
// Определение структуры записи для использования в файле typedef struct Names {
long int RecNo;
char FirstName[20] ;
} NAMES;
int main ()
(
FILE *fHandle;
NAMES NameRecord;
char ch;
// Создать файл для исправления
if ((fHandle = fopen ( "NAMES2.BIN", "w+b")) == NULL) {
printf("%s\n","Error Opening File");
return (1);
)
// Скопировать имена в NameRecord и
// записать NameRecord в файл.
// Номер записи вычисляется на основе ее размера
//и положения файлового указателя
strcpy(NameRecord.FirstName,"Nanci");