Информатика и технология программирования

       

Файл записей фиксированной длины


Структура файла записей фиксированной длины -обычный массив переменных одного типа. Соответственно записи в нем последовательно нумеруются, начиная с 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*)&#38nrec,sizeof(int),1,fd); // Записать в файл nrec и size


fwrite((void*)&#38size,sizeof(int),1,fd); //


fclose(fd);
return 1;
}
//----------------------------------------------------------------


// Открыть файл


int Open(char *name)
{
if ((fd=fopen(name,"rb+wb"))==NULL) // Открыть существующий


return 0; // для чтения и записи


fwrite((void*)&#38nrec,sizeof(int),1,fd); // Читать из файла nrec и size


fwrite((void*)&#38size,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 - номер записи


&#35include &#60alloc.h&#62
void *Get(int n)
{
void *pp;
if (fd==NULL) return NULL; // Файл не открыт



if (n &#62= nrec) return NULL; // Номер записи некорректен

pp = ( void*) new char [size]; // Создать динамическую переменную

if (fseek(fd, 2*sizeof(int) + n*size, SEEK_SET) ==EOF)
{ delete pp; return NULL; } // Ошибка позиционирования

if (fread(pp, size, 1, fd) !=1)
{ delete pp; return NULL; } // Ошибка чтения

return pp;
}
//-------------------------------------------------------------

// Добавить запись

int Append(void *pp)
{
if (fd==NULL) return 0; // Файл не открыт

fseek(fd,0L,SEEK_ END); // Установиться на конец файла

if (fwrite(pp,size,1,fd)!=1) return 0; // Ошибка

nrec++;
fseek(fd,0L,SEEK_ SET); // Обновить переменную nrec в файле

if (fwrite((void*)&#38nrec,sizeof(int),1,fd)!=1)
return 0; // Ошибка

return 1; }
// ----------------------------------------------------------------

// Пример работы с файлом переменных типа double

void main() {
double a,*pd [20];
if (!Create("a.dat",sizeof(double))
return; // Создать файл

if (!Open("a.dat")) return; // Открыть файл

for (int i=0; i&#60 20; i++) // Добавить 20 переменных

{ a=i; Append((void*)&#38a);
for (int i=0; i&#60 20; i++) // Прочитать в обратном порядке

pd[i]=Get(19- i); // в динамические переменные

} } // и сформировать массив указателей


Содержание раздела