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

return;

)

fread(&il,sizeof(int),1,F);            // чтение i

freadf&jl,sizeof(int),1,F);            // чтение j

fread(sal,sizeof(double),1,F);         // чтение а

fread(si,sizeof(char),strlen(s)+1,F); // чтение строки s

fclose(F) ;

В данном примере создается двоичный файл «Test.dat» и в него записывается
два целых числа i и j, действительное число а и строка s. Затем этот файл закрыва-
ется, открывается для чтения и данные из него читаются в переменные il, ]1, а1 и
si.

В отношении записи и чтения чисел, вероятно, все понятно. А вопрос записи и
чтения строк имеет смысл обсудить подробнее.

В приведенном примере запись строки производится оператором

fwrite(s,sizeof(char),strlen(s)+1,F); // запись строки's

Запись ведется по символам и указано число записываемых символов
strlen(s)+l (единица добавляется на нулевой символ в конце). Читается строка
аналогично:

freadtsl,sizeof(char),strlen(s)+1,F); // чтение строки s

При этом чтение тоже идет по символам и читается strlen(s)+l символов.
Тут внимательный читатель может увидеть некоторую подтасовку. В данном
учебном примере мы знаем длину строки, которую записали в файл, и можем про-
читать требуемое число символов. Но как быть в реальных задачах, когда мы, ско-
рее всего, не будем знать длину записанной строки? Эту проблему можно решить
несколькими путями. Проще всего записывать и читать весь массив символов как
единое целое:

fwrite(s,sizeof(s), 1,F) ;

fread(si,sizeof(s),1,F) ;

Этот путь простой, но имеет один недостаток: записывается всегда весь массив
символов s, даже если содержащаяся в нем строка много короче размера массива.
Приведенные операторы в нашем примере эквивалентны операторам

fwrite(s,sizeof(char)*10,1,F);

freadtsl,sizeof(char)*10,1,F);

Таким образом, при частичном заполнении массива в файле будут храниться
лишние байты. Если в файле много строк разной длины, а все они будут храниться
как максимальная из них, то размер файла будет значительно больше действите-
льно необходимого.

Другой путь — записывать по-прежнему по символам, но при чтении прове-
рять каждый символ, чтобы при появлении нулевого символа закончить чтение
строки. Это может быть реализовано следующим образом:

// запись строки
fwrite(s,sizeof(char),strlen(s) +1, F) ;

// чтение строки

for(int ind = 0; ind < 10; ind++)

(

fread(sl+ind,sizeof(char) , 1, F) ;

if(si[ind] == '\0') break;

1

Здесь в цикле for читается за раз по одному символу и при обнаружении нуле-
вого символа цикл прерывается. Обратите внимание, что адрес чтения очередного