С каждым файлом связан указатель записи-чтения (маркер), задающий место доступа к очередному байту файла. При выполнении последовательного доступа маркер позиционируется (смещается) автоматически при любой операции чтения или записи. Если после ввода информации в файл требуется её прочитать с самого начала, необходимо прежде всего использовать функцию вида
rewind (fp), где fp – указатель на открытый файл.
Эта функция устанавливает маркер записи-чтения на начало файла. Файл можно обрабатывать в любом порядке, если передвинуть маркер в нужную позицию функцией вида
Int fseek (указатель_потока, (long) смещение, начало_отсчета),
которая сдвигает маркер записи-чтения файла, на который ссылается указатель_потока, на величину смещения от начала_отсчета. При этом если смещение > 0, то выполняется сдвиг к концу файла, а если смещение < 0 – к началу файла.
Начало_отсчета может принимать следующие значения:
SEEK_SET (или 0) – сдвиг выполняется от начала файла;
SEEK_CUR (или 1) – сдвиг выполняется от текущей позиции маркера;
Seek_end (или 2) – сдвиг выполняется от конца файла;
Символьные константы начала_отсчета определены в заголовочном файле stdio.h. В случае успеха функция возвращает 0, иначе – EOF (–1).
Например, если из файла с указателем myfile прочитана строка из 20 символов, и мы хотим вернуться к началу этой строки, необходимо позиционировать маркер записи-чтения файла функцией
fseek (myfile, -20, SEEK_CUR).
Функции файлового ввода-вывода
Эти функции можно разделить на несколько типов в зависимости от структуры передаваемых данных:
Тип функции ввода-вывода | Структура данных |
Посимвольный | Поток символов |
Построчный | Последовательность строк переменной длины |
Форматированный | Форматированные поля с разделителями |
Блоковый | Последовательность записей постоянной длины (блоков) |
Первые три типа файловых функций ввода-вывода работают аналогично стандартным функциям ввода-вывода, однако требуют задания указателя на обрабатываемый файл, например, описанного как
FILE *fp.