Информатика и технология программирования
типа данных, основанный на использовании
Из того, что функции
fread,fwrite
копируют данные из памяти в файл без преобразования, "байт в байт", следует естественный способ сохранения в файле переменной любого
типа данных, основанный на использовании операции
sizeof
для определения ее размерности:
long a; // Записать в файл переменную типа long,
fseek (fd, 20L, SEEK_SET); // начиная с позиции 20
fwrite (&a, sizeof(long),1,fd);
struct man b; // Добавить в файл переменную типа man
fseek (fd,0L,SEEK_END);
fwrite (&b, 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*)&a, sizeof(long),1,fd);
Нетрудно заметить, что в
управлении внутренней памятью (переменные, память программы) и внешней памятью (файлы) много общего. Используя возможности адресной арифметики и преобразования типов указателей, можно произвольным образом планировать память программы, размещая в ней различные переменные (см. 4.5). Аналогичная "свобода выбора" имеет место и при работе с файлами: программист имеет право произвольным образом строить в файле любые структуры данных подобно тому, как он это делает в памяти. Но с небольшой разницей: если в памяти программы структуры данных можно организовать используя обычные переменные языка, динамические переменные, указатели и стандартные операции над ними, то при работе с файлом программист всего этого лишен. Он не может присвоить имя переменной в файле и пользоваться им, он не может выполнить над ней никаких операций, кроме как прочитав ее в память программы в переменную такого же типа. Короче говоря, программа вынуждена работать со структурами данных в файле на уровне физических адресов, не имея соответствующей поддержки транслятора.
Содержание
Назад
Вперед