Стандартная библиотека ввода-вывода содержит множество функций для чтения и записи. Файл может читаться посимвольно, построчно, с форматными преобразованиями или поблочно.
Когда аргументом функции является указатель на FILE, этот указатель в описании функции называют потоком.
Объявления прототипов функций чтения-записи находятся в файле заголовков stdio.h, поэтому программы, использующие эти функции, должны включать следующую директиву препроцессора:
#include <stdio.h>
EOF — признак конца файла определен в файле заголовков stdio.h. Значение EOF зависит от компилятора (типичным значением для ОС UNIX является –1). Значение EOF может быть введено с клавиатуры путем нажатия клавиш <CTRL>, <D> в начале строки.
Описания функций чтения-записи
int fgetc(FILE *stream)
Функция возвращает следующий символ из потока в формате int или EOF, если исчерпан файл или обнаружена ошибка.
int fputc(int c, FILE *stream)
Функция пишет символ, переведенный в формат unsigned char в поток, возвращает переданный символ или EOF в случае ошибки.
int ungetc(int c, FILE *stream)
Функция отправляет символ, переведенный в формат unsigned char, обратно в поток. При следующем чтении из потока он будет получен снова. Для каждого потока вернуть можно не более одного символа. Нельзя возвращать EOF. Функция возвращает переданный символ или EOF в случае ошибки.
char *fgets(char *s, int n, FILE *stream)
Функция читает не более n-1 символов в массив s, прекращая чтение, если встретился символ новой строки, который включается в массив, кроме того, записывается символ '\0'. Функция возвращает адрес массива s или NULL, если исчерпан файл или обнаружена ошибка.
int fputs(char *s, FILE *stream)
Функция пишет строку s, которая может не иметь символ '\n', в поток, возвращает неотрицательное целое или EOF в случае ошибки.
int fscanf( FILE *stream, const char *format, ... /*аргументы*/)
Функция читает данные из потока под управлением формата и преобразованные величины присваивает аргументам, каждый из которых должен быть указателем. Завершает работу, если исчерпался формат. Возвращает EOF по исчерпании файла или перед любым преобразованием, если возникла ошибка. В остальных случаях функция возвращает количество преобразованных и введенных элементов. Правила построения форматной строки такие же, как для функции scanf().
int fprintf( FILE *stream, const char *format, ... /*аргументы*/)
Функция преобразует и пишет вывод в поток под управлением формата. Возвращаемое значение — число записанных символов или, в случае ошибки, отрицательное значение. Правила построения форматной строки такие же, как для функции printf().
int fread (void *ptr, size_t size, size_t nitems, FILE *stream)
Функция читает из потока в массив ptr не более nitems объектов размера size. Функция возвращает количество прочитанных объектов, которое может быть меньше заявленного. Для определения состояния после чтения следует использовать функции обработки ошибок feof() и ferror().
int fwrite (const void *ptr, size_t size, size_t nitems, FILE *stream)
Функция пишет из массива ptr в поток nitems объектов размера size. Функция возвращает количество записанных объектов, которое в случае ошибки меньше nitems.
В следующих примерах рассмотрены различные варианты копирования файла. Предполагается, что файлы предварительно открыты с помощью функции fopen() и после использования будут закрыты функцией fclose().
Пример 1
Копирование файла посимвольно
while((c=fgetc(rp)) != EOF)
   fputc(c, wp);
Пример 2
Копирование файла построчно
char buf[256];
while((fgets(buf, 256, rp)) != NULL)
   fputs(buf, wp);
Пример 3
Копирование файла в соответствии с указанным форматом
char name[40];
int id;
while(fscanf(rp,"%s %d", name, &id) != EOF)
   fprintf (wp, "%s %d\n", name, id);
Пример 4
Копирование файла поструктурно
struct info{
            char name[50];
            int id;
           } part;
while (fread(&part, sizeof(part), 1, rp) != 0)
   fwrite (&part, sizeof(part),1, wp);
В данных примерах rp — указатель FILE, используемый для доступа к файлу, открытому для чтения, wp — для записи. Эти указатели инициируются при открытии файлов, содержат информацию об открытии файла и не должны изменяться программистом. Эти указатели совместно используются функциями стандартной библиотеки ввода-вывода так, чтобы гарантировать, что следующие друг за другом вызовы функций чтения или записи обеспечивают последовательный доступ. Поэтому данные указатели иногда называют внутренними указателями.