Разделы сайта:
Статьи по C и C++Стандартная библиотека CКнигиЮмор
Форматированный ввод-вывод

Часть 3. Работа с файлами

В предыдущей части мы рассмотрели стандартный потоки stdin и stdout*, однако в С также предусмотрены потоки пользователя-программиста, использующиеся для работы с файлами. Все эти потоки имеют тип указателя на структуру FILE. Для того, чтобы использовать их, необходим сначала открыть или создать файл.

FILE *fopen(const char *filename, const char *mode);
FILE *_wfopen(const wchar_t *filename, const wchar_t *mode);
Функция создает поток для файла filename с режимом mode, и возвращает указатель на файловый поток. Функция _fdopen вместо имени файла использует в качестве параметра дескриптор. О них мы говорили во второй статье. Функция fopen предусматривает 6 режимов доступа:
ЗначениеОписание
rОткрыть только для чтения.
wСоздать для записи; если файл существует, он будет полностью переписан.
aДобавить; открыть для записи в конец файла, если файл отсутствует, создать и открыть для записи.
r+Открыть для обновления: чтение и запись.
w+Создать новый файл для обновления: чтение и запись, если он существует, он будет перезаписан.
a+Открыть (или создать, если таковой не существует) для обновения в конце файла.
Помимо этого, необходимо выбрать один из дополнительных режимов:
  • t - режим текстового файла
  • b - режим бинарного файла
  • c - при очистке буфера функцией fflush, сохранять его на диск
  • n - отключение флага commit
  • S,R - различные оптимизации для ввода-вывода
  • T,D - различные опции для работы с временными файлами.
Опции t и d не зависят от глобальной переменной _fmode.
Так как при открытии некоторого файла выделяется память, его следует сохранить, а затем очистить память. Оба этих этапа работы с файлом исполняет функция fclose.
int fclose(FILE *stream);

Большинство функций работы с файлом аналогичны тем, что мы рассматривали ранее. Единственные отличие: необходмо указывать указатель на файловый поток. Эти функции, как правило, начинаются с префикса "f". Для бинарных файлов предусмотрены функции fread и fwrite.

size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
Функция fread считывает в ptr данные, размером size за n итераций из потока stream. Суммарные объем данных - n*size. Функция возвращает общий объем данных, которые были считаны из потока.
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);
Функция fwrite записывает в поток stream данные из массива ptr, длина которого - n элемнтов, а размер каждого элемента - size. Функция возвращает общий объем данных, которые были записаны в поток.

Необязательно считывать данные из самого начала. Для перемещения внутри файла существует функция fseek.

int fseek(FILE *stream, long offset, int whence);
Функция смещает внутренний указатель файла на offset байтов относительно параметра, указанного в параметре whence. Параметр whence может быть равен: SEEK_CUR - относительно текущей позиции SEEK_SET - относительно начала файла SEEK_END - относительно конца файла При успехе возвращаемым значением будет нуль. Если вам необходимо вернуться в начало файла, используйте rewind, являющююся эквивалентом вызова fseek(stream, 0L, SEEK_SET).
long int ftell(FILE *stream);
Функция ftell вззвращает текущую позицию в файле.
Аналогично, fgetpos подучает файловую позицию, а fsetpos ее записывает.
* - Помимо этих двух потоков существует также поток stderr - стандартный поток вывода ошибок.

Прочие полезные функции

Если Вы работаете с большим количеством файловых потоков, Вам будет полезна функция fcloseall. Она закрывает все ранее созданные потоки. Исключения составляют потоки, использующиеся для внутренних целей: stdin, stdout, stderr и т. п.

int fcloseall(void);
Функция возвращвет общее количество закрытых потоков или EOF при ошибке.

Если Вы хотите использовать дескрипторы для работы с файлами в комбинации с файловыми потоками Вам будут полезны макрос fileno функция fdopen. Последнюю мы рассмотрели в предыдущей части; вот прототип fileno:

int fileno(FILE *stream);
Возвращает дескриптор файла stream.

Функция freopen позволяет перенаправлять потоки, то естьприменять новые настройки имени файла и флагов для данного потока. Также существует возможность перенаправлять вызовы стандартных потоков в файл.

FILE *freopen(const char *filename, const char *mode, FILE *stream);
FILE *_wfreopen(const wchar_t *filename, const wchar_t *mode, FILE *stream);
При успехе пренаправления потока stream в файл filename с параметрами mode функция возвращает перенаправленный stream, при неуспехе - NULL.

Также существует возможность принимать и записывать в поток целое с помощью функций getw и putw.

Назад
Автор и разработчик сайта - Кляус Сергей. Спасибо Форуму на Исходниках.RU за помощь в сборе материалов.
X