Позиционирование в потоке
Одной из характеристик потока является позиция чтения (записи). Фактически, она представляет собой простой счетчик байтов относительно начала файла. Именно в эту позицию помещаются даны при очередной попытке записи, из позиции чтения извлекаются данные при чтения информации.
Позиция текущего указателя потока изменяется при выполнении операций чтения записи, перемещаясь на число, равное количеству записанных (считанных) байт. При дисковом вводе/выводе позиция может меняться произвольно. Потоки, поддерживающие смену позиции называются потоками с произвольным доступом. Следующие функции, позволяющие осуществлять произвольный доступ:
long int ftell (FILE *stream);
Функция ftell возвращает текущую позицию указателя в файле. Она может завершиться с ошибкой, если файл не поддерживает позиционирование или если позиция не может быть представлена (не помещается) как long. В случае ошибки функция ftell возвращает -1. Еще один способ получить значения указателя потока – использовать функцию
int fgetpos(FILE *fp, fpos_t *pos);
Переместить позицию текущего указателя можно с использованием функции:
int fseek (FILE *stream, long int offset, int base);
Здесь stream – потоковая переменная. а параметры offset и base задают новое значение указателя: он устанавливается по смещению offset байт относительно позиции base, в качестве которой можно задать:
SEEK_SET-начало потока
SEEK_END-конец потока
SEEK_CUR-текущее положение.
Тогда вызов
fseek(fp, 0, SEEK_SET);
переместит указатель в начало потока, а вызов
fseek(fp, -4, SEEK_CUR);
возвратит его на 4 байта назад относительно текущей позиции.
На позицию указателя могут повлиять функции:
int fsetpos(FILE*fp, const fpos_t *pos);
void rewind(FILE *fp); //перемещает указатель к началу потока
Дата добавления: 2015-06-01; просмотров: 994;