Структура файла записей фиксированной длины -обычный массив переменных одного типа. Соответственно записи в нем последовательно нумеруются, начиная с 0, номер записи является индексом массива, смещение (адрес) записи с номером n определяется как n * sizeof (тип данных записи).
Количество записей в файле определяется путем деления его размера на размер записи. Структура файла может быть усложнена с целью обеспечения его большей универсальности и устойчивости к ошибкам выполнения операций ввода-вывода и программирования. Например, в начало файла можно поместить переменные, содержащие размер записи и количество их в файле.
nrec size 0 1 2 m nrec-1
____________________________________________________
int int double double ... ... ... ...
____________________________________________________
2 * sizeof(int)+ m * size - адрес (смещение) записи
//---------------------------------------------- bk591.cpp
int nrec,size;
FILE *fd;
//---------------------------------------------------------
// Создать пустой файл
int Create(char *name, int sz)
{
if ((fd=fopen(name,"wb"))==NULL) // Создать новый для записи
return 0;
size=sz; nrec=0;
fwrite((void*)&nrec,sizeof(int),1,fd); // Записать в файл nrec и size
fwrite((void*)&size,sizeof(int),1,fd); //
fclose(fd);
return 1;
}
//----------------------------------------------------------------
// Открыть файл
int Open(char *name)
{
if ((fd=fopen(name,"rb+wb"))==NULL) // Открыть существующий
return 0; // для чтения и записи
fwrite((void*)&nrec,sizeof(int),1,fd); // Читать из файла nrec и size
fwrite((void*)&size,sizeof(int),1,fd); //
fseek(fd,0L,SEEK_ END); // Соответствует ли длина файла
if (ftell(fd)!=2*sizeof(int)+(long)nrec*size)
{ fclose(fd); return 0; } // значениям nrec и size?
return 1;
}
//----- Загрузить из файла запись в динамическую переменную
// n - номер записи
#include <alloc.h>
void *Get(int n)
{
void *pp;
if (fd==NULL) return NULL; // Файл не открыт