Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LR_Fayly_2.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
280.06 Кб
Скачать

Функции для чтения из файла и записи в файл

Посимвольное чтение из файла – fgetc() (а также getc() – функция getc() эквивалентна fgetc(), но если она определена как макрос, то может обращаться к потоку stream несколько раз):

int fgetc(FILE *stream);

int getc(FILE *stream);

Обе функции возвращают следующий символ из потока stream в виде unsigned char (преобразованным к int) или EOF в случае достижения конца файла или обнаружения ошибки.

Посимвольная запись в файл – fputc() (а также putc() – функция putc эквивалентна fputc(), но если она определена как макрос, то может обращаться к потоку stream несколько раз):

int fputc(int c, FILE *stream);

int putc(int c, FILE *stream);

Обе функции записывают символ c (преобразованный в unsigned char) в поток stream. Возвращают записанный символ или EOF, если обнаружена ошибка.

Для посимвольной работы со стандартными потоками ввода и вывода существуют функции getchar() и putchar():

int getchar(void);

/* вызов getchar(с) эквивалентен getc(stdin) */

int putchar(int c);

/* вызов putchar(c) эквивалентен putc(c, stdout) */

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

int ungetc(int c, FILE *stream);

Символ EOF возвращать в поток нельзя! Функция ungetc() возвращает отправленный назад в поток символ или EOF при обнаружении ошибки.

Для чтения из файла строки предназначена функция fgets():

int *fgets(char *s, int n, FILE *stream);

Она считывает из потока stream не более n–1 следующих символов в массив s, прекращая ввод, если встретится символ конца строки, который включается в массив. После последнего прочитанного символа в массив записывается символ '\0'. Функция возвращает s при успешном выполнении, NULL в случае достижения конца файла или при обнаружении ошибки.

Для записи строки в файл предназначена функция fputs():

int fputs(const char *s, FILE *stream);

Она записывает в поток stream строку s, которая может как содержать, так и не содержать символ '\n' (строка записывается до символа '\0', не включая его). Функция возвращает неотрицательное целое число при успешном выполнении или EOF при обнаружении ошибки.

Для построчной работы со стандартными потоками ввода и вывода существуют функции puts() и gets():

int puts(const char *s);

char *gets(char *);

Функция puts() записывает в stdout строку s и сразу после неё символ конца строки, возвращает неотрицательное число при нормальном завершении и EOF в случае ошибки. Функция gets() считывает следующую строку из потока ввода в массив s, заменяя символ конца строки на '\0'. Возвращает s при нормальном завершении или NULL при достижении конца файла или обнаружении ошибки. Обратите внимание, что функция gets() не проверяет размер буфера по указателю s и возможно переполнение буфера, то есть функция является небезопасной.

Для форматированного ввода данных из файла и записи в файл используются функции fscanf() и fprintf(), отличающиеся от функций scanf() и printf() добавлением первого обязательного аргумента – файлового указателя:

int fscanf(FILE *stream, const char *format, ...);

int fprintf(FILE *stream, const char *format, ...);

Соответственно, все требования к строке формата и к соответствию последующих аргументов спецификаторам формата у них идентичны. Функция fprintf() возвращает количество записанных в поток символов или отрицательное число в случае ошибки. Функция fscanf() возвращает EOF, если до преобразования формата ей встречается конец файла или появилась ошибка, иначе функция fscanf() возвращает количество введенных и помещенных по назначению данных.

Функции прямого ввода-вывода fread() и fwrite():

size_t fread(void *ptr, size_t size, size_t nobj, FILE *stream);

size_t fwrite(void *ptr, size_t size, size_t nobj, FILE *stream);

Функция fwrite() записывает nobj объектов размера size из массива ptr в поток stream и возвращает количество фактически записанных объектов, которое в случае ошибки будет меньше nobj. Функция fread() считывает в массив ptr из потока stream не больше nobj объектов размеров size и возвращает количество считанных объектов, которое может оказаться меньше запрашиваемого nobj. Никаких преобразований данных при использовании этих функций не осуществляется.

Для определения успешного завершения или ошибки при чтении следует использовать функции feof() и ferror():

int feof(FILE *stream);

int ferror(FILE *stream);

Функция feof() возвращает значение, отличное от нуля, если для потока stream установлен признак конца файла (достигнут конец файла). Функция ferror() возвращает значение, отличное от нуля, если для потока stream установлен (включен) признак ошибки.

Дополнительную информацию о последней ошибке может дать целочисленное выражение errno, согласно стандарту C89 объявленное в <errno.h>.

Кроме вышеприведенных функций, в стандарте имеются еще две функции для обработки ошибок при работе с файлами:

int clearerr(FILE *stream);

int perror(const char *s);

Первая функция сбрасывает индикаторы ошибок потока и конца файла (если они установлены) для потока stream. Вторая функция выводит в поток stderr зависящее от реализации сообщение об ошибке, соответствующее текущему значению errno. Вызов perror(s) эквивалентен вызову fprintf (stderr, “%s: %s\n”, s, “зависящее от errno сообщение об ошибке”).

Обычно принято считать, что функции форматированного ввода-вывода и построчного ввода-вывода (как и посимвольного) применяются при работе с текстовыми файлами, а функции прямого ввода-вывода – при работе с двоичными файлами. Однако использованный режим открытия файла (текстовый или двоичный) не накладывает каких-либо ограничений на функции, используемые для чтения данных из файла и записи в файл. В приложении 1 приведены примеры обработки файлов обоих типов с помощью функций посимвольного (getc(), putc()) «ПРИМЕР2» и прямого (fread(), fwrite()) «ПРИМЕР4» ввода-вывода.

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

int fseek(FILE *stream, long offset, int origin);

Функция fseek() перемещает указатель позиции на заданный символ в потоке stream, причем последующая запись или чтение будут производиться с указанной позиции. Позиция задается смещением на offset символов относительно точки отсчета, заданной параметром origin: если он равен SEEK_SET, то смещение задается относительно начала файла; если равен SEEK_CUR – относительно текущей позиции в файле; если SEEK_END – относительно конца файла. В случае ошибки функция возвращает значение, отличное от нуля.

Узнать текущую позицию в потоке можно с помощью функции ftell():

long ftell(FILE *stream);

В случае ошибки вместо текущей позиции в потоке она возвращает значение –1L.

В системах, различающих текстовые и двоичные файлы, для текстовых файлов параметр offset функции fseek() должен быть или равным нулю при любом значении origin, или offset должен быть значением, полученным с помощью функции ftell(), а origin должен быть равен SEEK_SET. В противном случае указатель текущей позиции в потоке может принимать неожиданные значения (см. «ПРИМЕР6» приложения1).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]