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


Двоичный файл - неограниченный массив байтов - часть 3


Из того, что функции fread,fwrite копируют данные из памяти в файл без преобразования, "байт в байт", следует естественный способ сохранения в файле переменной любого типа данных, основанный на использовании операции sizeof для определения ее размерности:


long a; // Записать в файл переменную типа long,


fseek (fd, 20L, SEEK_SET); // начиная с позиции 20


fwrite (&#38a, sizeof(long),1,fd);
struct man b; // Добавить в файл переменную типа man


fseek (fd,0L,SEEK_END);
fwrite (&#38b, sizeof b,1,fd);
double *pd; // Прочитать с начала файла динамический


pd = new double[n]; // массив в n переменных типа double


fseek(fd,0L,SEEK_SET); //


fread((void*)pd, sizeof(double),n,fd);

Номер байта (позицию) в файле, начиная с которого размещается переменная в дальнейшем будем называть также СМЕЩЕНИЕМ или АДРЕСОМ этой переменной в файле.


fseek(fd,20L,SEEK_SET);
fwrite((void*)&#38a, sizeof(long),1,fd);

Нетрудно заметить, что в управлении внутренней памятью (переменные, память программы) и внешней памятью (файлы) много общего. Используя возможности адресной арифметики и преобразования типов указателей, можно произвольным образом планировать память программы, размещая в ней различные переменные (см. 4.5). Аналогичная "свобода выбора" имеет место и при работе с файлами: программист имеет право произвольным образом строить в файле любые структуры данных подобно тому, как он это делает в памяти. Но с небольшой разницей: если в памяти программы структуры данных можно организовать используя обычные переменные языка, динамические переменные, указатели и стандартные операции над ними, то при работе с файлом программист всего этого лишен. Он не может присвоить имя переменной в файле и пользоваться им, он не может выполнить над ней никаких операций, кроме как прочитав ее в память программы в переменную такого же типа. Короче говоря, программа вынуждена работать со структурами данных в файле на уровне физических адресов, не имея соответствующей поддержки транслятора.




Начало  Назад  Вперед