694_____________________________________________Глава 12

символа в данном случае задается выражением sl+ind. Нельзя было бы вместо это-
го использовать выражение sl[ind], так как функция fread требует указания
именно адреса, а не значения переменной, в которую осуществляется чтение.

Функцию fread в этом примере можно было бы заменить на fgetc, которая чи
тает один символ из потока:

si[ind] = fgetc(F) ;

И, наконец, еще один вариант чтения строк неизвестной длины из двоичного
файла. Можно перед строкой записывать в файл целое число, равное числу симво-
лов в строке. Тогда чтение строки не встретит затруднений:

// запись строки
int it = strlen(s)+l;

fwrite(bit,sizeof(int),1,F) ;

fwrite(s,sizeof(char),it,F);

// чтение строки
fread(sit,sizeof(int),1,F);

fread(si,sizeof(char),it,F);

В приведенных примерах чтение происходило последовательно. Но, работая
двоичными файлами, можно организовать произвольное чтение данных. Для это-г
служит указатель (курсор) файла, который определяет текущую позицию в фай.1
для чтения и записи. При чтении или записи указатель автоматически смещаете:

на число обработанных байтов. Узнать позицию указателя можно функцией ftell,
которая возвращает текущую позицию:

long int ftell(FILE *stream);

Изменить позицию указателя можно функцией fseek:

int fseekfFILE *stream, long offset, int whence);

Эта функция задает сдвиг на число байтов offset относительно точки отсчета,
определяемой параметром whence. Параметр whence может принимать значения:

Константа	whence	Точка отсчета
SEEKJSET	0	Начало файла
SEEKCUR	1	Текущая позиция
SEEKEND	2	Конец файла

Если задано значение whence = 1, то offset может быть положительным (сдвиг
вперед) или отрицательным (сдвиг назад).

Функция rewind перемещает указатель на начало файла (позиция 0). Впро-
чем, то же самое можно сделать оператором

fseek(F, OL, 0);

Возможность перемещать указатель особенно полезна в файлах, которые со-
• стоят из однородных записей одинакового размера. Например, если в файле запи-
саны только действительные числа типа double, то для того, чтобы прочитать i-oe
число, достаточно выполнить операторы

fseek(F, sizeof(double)*(i-1), 0) ;

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

Таким образом можно читать любые записи в любой последовательности.
С помощью перемещения указателя можно редактировать записи в файле.
Пусть, например, вы хотите одно из чисел, записанных в файле, изменить, умно-