Типы данных в языке C++__________________________________695

жив его на 10. Это можно сделать, если открыть файл в режиме чтения и записи
(например, «rb+»), установить позицию, соответствующую изменяемому числу, и
выполнить операторы:

fread(&a,sizeof(double),1,F) ;

a *= 10;

fseek(F,-sizeof(double),1);

fwrite(&a,sizeof(double), 1, F) ;

Первый из этих операторов читает число в переменную а, второй — умножает
его на 10. Третий оператор возвращает текущую позицию на одну запись назад, по-
скольку после выполнения fread позиция сдвинулась вперед. Последний оператор
пишет в ту позицию, в которой было прочитано число, новое значение.

Ту же задачу можно решить иначе:

long int pos = ftell(F);          // запоминание позиции
fread(&a,sizeof(double),1,F) ;

a *= 10;

fseek(F,pos,0);                   // восстановление позиции
fwrite(&a,sizeof(double),1,F) ;

Здесь функция ftell запоминает позицию, из которой читается число, а функ-
ция fseek восстанавливает эту позицию перед записью измененного числа.

С помощью двоичных файлов можно записывать и читать не только числа и
строки, но и гораздо более сложные объекты, например, структуры. Ниже приве-
ден пример, в котором определяется тип структуры spers, объявляются перемен-
ные этого типа pers и persi, поля структуры pers заполняются, а затем она цели-
ком записывается в файл. После того, как файл закрывается, он открывается для
чтения и данные из него читаются в структуру persi.

struct spers
{

char Name[20] ;

int year;

};

struct spers pers, persi;

strcpy(pers.Name,"Иванов");

pers.year = 1960;

FILE *F;

if ((F = fopen("Test2.dat", "wb")) == NULL)
(

ShowMessage("Файл не удается создать");

return;

}

fwrite(&pers,sizeof(spers),1,F) ;

fclose(F) ;

if ((F = fopen("Test2.dat", "rb")) == NULL)
{

ShowMessage("Файл не удается открыть");

return;

)

fre ad(&persl,sizeof(spers),1,F);

fclose(F) ;

12.9.2.4 Ввод/вывод, использующий дескрипторы

В С предусмотрен еще один механизм работы с файлами, основанный не на
указателях на структуру типа FILE, а на дескрипторах. Файлы, открываемые по-
добным образом, не работают с буферами и с форматированными данными.