134
Листинг 5.5. Перенаправление стандартного вывода с
помощью функции freopen().
Весьма полезной с практической точки зрения является функция
создания и открытия временных файлов tmpfile() (см. листинг 5.6).
#include <stdio.h>
FILE *tmpfile (void);
Листинг 5.6. Описание функции tmpfile().
Временный файл открывается на изменение (w+) и автоматически
удаляется после закрытия всех ссылок на него.
Использование функции tmpfile() предпочтительнее генерации
«временного» имени с помощью функции tmpnam() и последующего
создания файла с этим именем, поскольку в промежутке какой-либо
другой процесс может создать одноименный файл.
Чтение и запись данных
Чтение данных из файла выполняют функции read() и fread() (см.
листинг 5.7).
#include <unistd.h>
ssize_t read (int fd, void *buf, size_t nbyte);
#include <stdio.h>
size_t fread (void *restrict buf, size_t size,
size_t nitems, FILE *restrict stream);
Листинг 5.7. Описание функций read() и fread().
Функция read() пытается прочитать nbyte байт из файла,
ассоциированного с дескриптором fd, и поместить их в буфер buf.
Для файлов, допускающих позиционирование, read() выполняет
чтение, начиная со значения индикатора текущей позиции,
ассоциированного с дескриптором fd. После завершения операции этот
индикатор увеличивается на количество прочитанных байт. Для
устройств, не поддерживающих позиционирования (таких, например,
как терминал), значение упомянутого индикатора не определено, а
чтение выполняется с текущей позиции устройства.
При успешном завершении read() возвращает количество байт,
реально прочитанных и помещенных в буфер; это значение может
оказаться меньше значения аргумента nbyte, если до конца файла
оставалось меньше, чем nbyte байт. Например, если текущая позиция
совпадала с концом файла, результат будет равен 0. В случае ошибки
возвращается -1.
Функция буферизованного ввода/вывода fread() во многом
аналогична read(), но число читаемых байт задается как произведение
размера одного элемента (аргумент size) на число элементов (аргумент
nitems), а результатом служит количество успешно прочитанных
элементов. В стандарте оговаривается, что элементы читаются побайтно.
Число элементов, успешно прочитанных функцией fread(), может
быть меньше затребованного, только если достигнут конец файла или
произошла ошибка чтения. В таком случае fread() устанавливает для