Файловый ввод-вывод

Файл – это именованная область данных на каком-либо носителе информации.

Типы файлов (с точки зрения интерпретации информации в программе на Си):

Основные операции производимые над файлами:

Дополнительные операции:

Для работы с файлами в программах на Си используется заголовочный файл stdio.h, в котором объявлен специальный тип данных — структура FILE, предназначенная для хранения атрибутов (параметров) файлов (указатель текущей позиции файла, признак конца файла, флаги индикации ошибок, сведения о буферизации и др.). Переменные типа FILE нельзя создавать вручную.

Для работы с файлом в программе нужно создать "указатель на файл".

FILE *имя = NULL;

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

Открытие файла

FILE *fopen(const char *filename, const char *mode);
где
filename -- название файла, mode -- режим открытия.

Функция возвращает указатель на файл, если тот был успешно открыт. В противном случае -- NULL.

Название файла содержит только имя файла, если файл находится в текущем каталоге. Иначе необходимо указать абсолютный или относительный путь к файлу.

Примеры:

Режимы открытия файлов

r только чтение
w Только запись. Если файл существовал, то он переписывается.
a Добавление: открытие файла для записи в конец, или создание файла.
r+ Открывает файл для обновления (чтение и запись).
w+ Открывает файл для обновления (чтение и запись), переписывая файл, если он существует.
a+ Открывает файл для записи в конец файла или для чтения.

Во втором параметре дополнительно может указываться символ t и b для указания текстовый файл или двоичный (необязательно для многих операционных систем):

 rt, wt, at, rt+, wt+, at+

 rt, wt, at, rt+, wt+, at+

Закрытие файла

int fclose(FILE *stream);

где stream -- указатель на открытый файл.

Функция возвращает:

Можно закрыть и открыть новый файл в одну команду:

FILE * freopen(const char *filename, const char *mode, FILE *stream);
Функция возвращает указатель на файл, если все нормально, и NULL, если возникла ошибка открытия нового файла или закрытия старого.

Чтение из текстового файла

Форматированное чтение

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

Функция возвращает:

Чтение строки

char * fgets(char * buffer, int maxlen, FILE *stream);

В maxlen следует указать размер буфера, чтобы при записи в память функция чтения не вышла за его границы.

Функция считывает строку до символа перевода каретки '\n' или maxlen — что наступит раньше.

Функция возвращает указатель на buffer, если все нормально, и NULL, если возникла ошибка или достигнут конец файла.

Чтение символа

int fgetc(FILE *stream);

Функция возвращает код символа, если все нормально, и EOF, если произошла ошибка или достигнут конец файла.

Помещение символа обратно в поток

int ungetc(int c, FILE *stream);

Функция возвращает код символа, если все успешно, и EOF, если произошла ошибка.

Запись в текстовый файл

Форматированный вывод

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

Функция возвращает число записанных символов, если все нормально, и отрицательное значение, если произошла ошибка.

Запись строки

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

Функция возвращает число записанных символов, если все нормально, и EOF, если произошла ошибка.

Запись символа

int fputc(int c, FILE *stream);

Функция возвращает код записанного символа, если все нормально, и EOF, если произошла ошибка.

Чтение и вывод в двоичные файлы

Чтение из двоичных файлов

size_t fread(void *buffer, size_t size, size_t num,FILE *stream);

Функция возвращает количество прочитанных блоков.

Если оно меньше num, то произошла ошибка или достигнут конец файла.

Запись в двоичный файл

size_t fwrite(const void *buffer, size_t size, size_t num, FILE *stream);

Функция возвращает количество записанных блоков.

Если оно меньше num, то произошла ошибка.

Проверка на достижение конца файла

int feof(FILE *stream);

где stream -- указатель на открытый файл

Функция возвращает 0, если файловый поток не кончился, и не ноль, если достигнут конец файла.

Навигация по файлу

Чтение текущего смещения в файле

long int ftell(FILE *stream);

Изменение текущего смещения в файле

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

Значение origin может принимать три значения:

Функция возвращает 0, если все нормально, и не ноль, если произошла ошибка.

Перемещение к началу файла

void rewind(FILE *stream);

Чтение текущей позиции в файле

int fgetpos(FILE *stream, fpos_t *pos);

Установка текущей позиции в файле

int fsetpos(FILE *stream, const fpos_t *pos);

Функции возвращают 0, если все нормально, и не ноль, если произошла ошибка.

Структура fpos_t

typedef struct fpos_t {
  long off;
  mbstate_t wstate;
 } fpos_t;

Получение признака ошибки

int ferror(FILE *stream);

Функция возвращает ненулевое значение, если возникла ошибка.

Функция сброса ошибки

void clearerr(FILE *stream);

Функция вывода сообщения об ошибке

void perror(const char *string);

Буферизация

Функция очистки буфера:

int fflush(FILE *stream);

Функция возвращает 0, если все нормально, и EOF, если произошла ошибка.

Функция управления буфером:

void setbuf(FILE *stream, char *buffer);

Создает буфер размером BUFSIZ. Используется до ввода или вывода в поток.

Временные файлы

Функция создания временного файла:

FILE * tmpfile(void);

Создает временный файл в режиме wb+. После закрытия файла, последний автоматически удаляется.
Функция генерации имени временного файла:

char * tmpnam(char *buffer);

Удаление файла

int remove(const char *filename);

Функция возвращает 0 в случае успеха, не ноль в противном случае.

Переименование файла

int rename(const char *fname, const char *nname);

Функция возвращает 0 в случае успеха, не ноль в противном случае.