Работа с файлами в СИ
Файл – это именованная область данных на каком-либо носителе информации. Типы файлов (относительно языка «СИ»):текстовые;
бинарные.
Основные операции производимые над файлами:
Открытие файлов.
Чтение и запись данных.
Закрытие файлов.
Дополнительные операции:
Навигация по файлу.
Обработка ошибок работы с файлами.
Удаление и переименование файлов.
Описание переменной
Библиотека stdio.h
FILE *имя = NULL;
Открытие файла
FILE *fopen(const char *filename, const char *mode);
filename – название файла.
mode – режим открытия.
Функция возвращает указатель на файл, если тот был успешно открыт. В противном случае – NULL. Только имя, если файл находится в текущем каталоге. Иначе необходимо указать абсолютный или относительный путь к файлу.
Примеры:
"data.txt”
"..\\files\\data.txt"
"d:\\temp\\data.txt"
Режимы открытия файлов с СИ
r | только чтение |
w | Только запись. Если файл существовал, то он переписывается. |
a | Добавление: открытие файла для записи в конец, или создание файла. |
r+ | Открывает файл для обновления (чтение и запись). |
w+ | Открывает файл для обновления (чтение и запись), переписывая файл, если он существует. |
a+ | Открывает файл для записи в конец файла или для чтения. |
Перенаправление потоков
FILE * freopen(const char *filename, const char *mode, FILE *stream);
Функция возвращает:
Указатель на файл – все нормально,
NULL – ошибка переопределения.
Закрытие файла
int fclose(FILE *stream);
stream - указатель на открытый файл.
Функция возвращает:
0 – файл успешно закрыт.
1 – произошла ошибка закрытия файла.
Проверка на достижение конца файла
int feof(FILE *stream);
stream - указатель на открытый файл.
Функция возвращает:
0 – если конец файла еще не достигнут.
!0 – достигнут конец файла.
Открытие текстовых файлов
Во втором параметре дополнительно указывается символ t (необязательно):
rt, wt, at, rt+, wt+, at+
Чтение из текстового файла
Форматированное чтение
int fscanf(FILE *stream, const char * format, [arg] ...);
Функция возвращает:
>0 – число успешно прочитанных переменных,
0 – ни одна из переменных не была успешно прочитана,
EOF – ошибка или достигнут конец файла.
Чтение строки
char * fgets(char * buffer, int maxlen, FILE *stream);
Функция возвращает:
buffer – все нормально,
NULL – ошибка или достигнут конец файла.
Чтение строки
char * fgets(char * buffer, int maxlen, FILE *stream);
Функция возвращает:
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 – произошла ошибка.
Открытие бинарных файлов
Во втором параметре дополнительно указывается символ b (обязательно):rb, wb, ab, rb+, wb+, ab+
Чтение из бинарных файлов
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, то произошла ошибка.
Навигация по файлу
Чтение текущего смещения в файле:
long int ftell(FILE *stream);
Изменение текущего смещения в файле:
int fseek(FILE *stream, long int offset, int origin);
SEEK_SET (0) – от начала файла.
SEEK_CUR (1) – от текущей позиции.
SEEK_END (2) – от конца файла.
Функция возвращает:
0 – все нормально,
!0 – произошла ошибка.
Перемещение к началу файла:
void rewind(FILE *stream);
Чтение текущей позиции в файле:
int fgetpos(FILE *stream, fpos_t *pos);
Установка текущей позиции в файле:
int fsetpos(FILE *stream, const fpos_t *pos);
Функции возвращают:
0 – все успешно,
!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);
Функция переименования файла:
int rename(const char *fname, const char *nname);
Функции возвращают:
0 – в случае успеха,
!0 – в противном случае.
Примеры решения задач по файлам СИ
Следующая статья о указателях в СИ