286_________________________Часть II. Программирование на C++
Вы видите, что вставить текст в файл с последовательным доступом не так просто, как можно было подумать. Программа ничего не знает о том, что содержится в файле, она знает только, что и в какое место файла ей следует записать. Из-за этого в слове cheryl и пропала первая буква, когда поверх строки chip была записана строка patty: так как в строке patty на одну букву больше, то завершающий ее нуль попал на место буквы с строки cheryl.
Вы видите, что у файлов с последовательным доступом есть свои недостатки. Такие файлы хороши, пока они невелики и их можно быстро считать от начала до конца, да к тому же не слишком часто обновляются. Дописывать в конец файлов с последовательным доступом довольно просто. А вот чтобы исправить что-либо в середине такого файла, надо открыть второй, временный файл, записать в него всю информацию вплоть до места изменения, далее записать в него новые данные и скопировать оставшуюся часть первого файла. После завершения всей процедуры второй файл копируется поверх оригинала, а временный файл удаляется..
Ограничения, свойственные файлам с последовательным доступом, затрудняют их использование. Сейчас мы рассмотрим файлы с произвольным доступом и их преимущества.
Файлы С ПРОИЗВОЛЬНЫМ ДОСТУПОМ . Минимальной логической единицей хранения информации в файлах с произвольным доступом является запись. Основой записей являются структуры. Поэтому для того, чтобы правильно использовать такие файлы, необходимо иметь четкое представление о структурах С и C++. В общих чертах, структуры в этих языках являются производными типами данных, которые могут состоять из произвольного набора данных любых допустимых типов, в том числе и пользовательских.
Поскольку файлы с произвольным доступом служат для хранения записей определенной длины, то вычисление позиции четвертой (например) записи является относительно простой задачей. Если длина структуры Names равна 20 байтам, то смещение четвертой записи файла от начала может быть вычислено следующим способом:
Offset = ( 4 * sizeof(Names));
Иллюстрацией такого положения служит листинг 12.7. В этой программе та же самая информация, что и в программе из листинга 12.4, записывается в файл с произвольным доступом.
#include <stdio.h> «include <string.h>
// Определение используемой структуры записи typedef struct Names { char FirstName[20] ;
} NAMES;