Содержание | Глава 13

Функция fseek

#include <stdio.h>
int fseek(FILE *stream, long int offset, int origin);

Функция fseek() устанавливает указатель текущей позиции файла, связанного с потоком stream, в соответствии со значениями начала отсчета origin и смещения offset. Назначение этой функции — поддерживать операции ввода/вывода с произвольным доступом. Параметр offset равен количеству байтов, на которые будет смещен внутренний указатель файла относительно начала отсчета, заданного параметром origin. B качестве значения для параметра origin должен быть взят один из следующих макросов (определенных в заголовке <stdio.h>).

ИмяНазначение
SEEK_SETПоиск с начала файла
SEEK_CURПоиск с текущей позиции
SEEK_ENDПоиск с конца файла

Нулевое значение возврата свидетельствует об успешном выполнении функции fseek(), а ненулевое — о возникновении сбоя.

Вообще говоря, функцию fseek() следует использовать только при работе с двоичными файлами. При использовании же с текстовым файлом параметр origin должен иметь значение SEEK_SET, а параметр offset — значение, полученное в результате вызова функции ftell() для того же файла, или нуль (чтобы установить указатель текущей позиции файла на начало).

Функция fseek() очищает признак конца файла, связанный с заданным потоком. Более того, она аннулирует любой символ, ранее возвращенный в тот же поток через вызов функции ungetc() (см. раздел ungetc).

Пример

Приведенная функция производит поиск заданной структуры, имеющей тип addr. Обратите внимание на использование оператора sizeof для получения размера структуры.

struct addr {
  char name[40];
  char street[40];
  char city[40];
  char state[3];
  char zip[10];
} info;

void find(long int client_num)
{
  FILE *fp;

  if((fp=fopen("mail", "rb")) == NULL) {
    printf("Не удается открыть файл.\n");
    exit(1);
  }

  /* поиск подходящей структуры */
  fseek(fp, client_num*sizeof(struct addr), SEEK_SET);

  /* считывание данных в память */
  fread(&info, sizeof(struct addr), 1, fp);

  fclose(fp);
}

Зависимые функции

ftell() rerwind() fopen() fgetpos() fsetpos()
Содержание | Глава 13