290______________________________Часть II. Программирование на C++

В листинге 12.10 продемонстрированы зачатки действительно произвольного доступа. Номер каждой записи в файле рассчитывается на основе размера записи и текущего положения файлового указателя. Например, если длина записи равна 24 байтам, а текущая позиция равна 0 (начало файла), то номер записи может быть вычислен следующим образом:

RECORD NUMBER = POSITION / RECORD SIZE RECORD NUMBER =0/24 RECORD NUMBER = 0

Это справедливо для записей любых размеров и для любых положений файлового указателя. Чтобы узнать позицию записи внутри файла, следует умножить ее номер на размер отдельной записи. Номера записей всегда должны начинаться с нуля, поскольку о, умноженный на любой размер, остается нулем, т. е. началом файла. В листинге 12.10 приведен пример произвольного доступа к файлу, в котором смещение записи относительно начала файла вычисляется по размеру структуры и номеру записи.

h02901.jpg

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");