int dup(int fildes);
int dup2(int fildes, int fildes2);
Эти вызовы могут оказаться полезными в случае нескольких процессов, взаимодействующих через именованные каналы. Более глубоко мы рассмотрим системные вызовы dup
в главе 13.
Стандартная библиотека ввода/вывода
Стандартная библиотека ввода/вывода (stdio) и ее заголовочный файл stdio.h предоставляют универсальный интерфейс для системных вызовов ввода/вывода нижнего уровня. Библиотека, теперь часть языка С стандарта ANSI, в отличие от системных вызовов, с которыми вы встречались ранее, включает много сложных функций для форматирования вывода и просмотра ввода. Она также обеспечивает необходимые условия буферизации для устройств.
Во многих случаях эта библиотека используется так же, как низкоуровневые дескрипторы файлов. Вы должны открыть файл для установления пути доступа. Это действие возвращает значение, применяемое как параметр в других функциях библиотеки ввода/вывода. Эквивалент низкоуровневого дескриптора файла называется потоком и реализуется как указатель на структуру FILE*
.
Примечание
Не путайте эти потоки файлов с потоками ввода/вывода в языке С++ и механизмом STREAMS, описывающим взаимодействие процессов и введенным в системе AT&T UNIX System V Release 3, который не рассматривается в данной книге. Для получения дополнительной информации о средствах STREAMS обратитесь к спецификации X/Open (по адресу http://www.opengroup.org)и руководству по программированию AT&T STREAMS Programming Guide, поставляемому с системой System V.
Три файловых потока открываются автоматически при старте программы. К ним относятся stdin, stdout и stderr. Эти потоки объявлены в файле stdio.h и представляют вывод, ввод и стандартный поток ошибок, которым соответствуют низкоуровневые файловые дескрипторы 0, 1 и 2.
В данном разделе мы рассмотрим следующие функции:
□ fopen
, fclose
;
□ fread
, fwrite
;
□ fflush
;
□ fseek
;
□ fgetc
, getc
, getchar;
□ fputc
, putc
, putchar
;
□ fgets
, gets
;
□ printf
, fprintf
и sprintf
;
□ scanf
, fscanf
и sscanf
;
□ fopen
.
Библиотечная функция f o
pen — это аналог низкоуровневого системного вызова open
. Она используется в основном для файлов и терминального, ввода и вывода. Там, где нужно явное управление устройствами, больше подойдут системные вызовы, поскольку они устраняют потенциальные нежелательные побочные эффекты применения библиотек, например, в случае буферизации ввода/вывода.
Далее приведена синтаксическая запись функции:
#include
FILE *fopen(const char *filename, const char *mode);
Функция fopen
открывает файл, заданный в параметре filename
, и ассоциирует с ним поток. Параметр mode
описывает, как файл должен быть открыт. Он задается одной из следующих строк:
□ " r
" или " rb
" — открыть только для чтения;
□ " w
" или " wb
" — открыть для записи, укоротить до нулевой длины;
□ " а
" или " ab
" — открыть для записи, дописывать в конец файла;
□ " r+
" или " rb+
" или " r+b
" — открыть для изменения (чтение и запись);
□ " w+
" или " wb+
" или " w+b
" — открыть для изменения, укоротить до нулевой длины;
□ " a+
" или " ab+
" или " а+b
" — открыть для изменения, дописывать в конец файла. Символ b
означает, что файл бинарный, а не текстовый.
Примечание
В отличие от MS-DOS, системы UNIX и Linux не делают различий между текстовыми и бинарными файлами. UNIX и Linux обрабатывают их одинаково с эффективностью обработки бинарных файлов. Важно также учесть, что параметр mode
должен быть строкой, а не символом. Всегда применяйте двойные кавычки, а не апострофы.
В случае успешного завершения функция fopen
возвращает ненулевой указатель на структуру FILE*
. В случае сбоя она вернет значение NULL
, определенное в файле stdio.h.
Количество доступных потоков ограничено, как и число дескрипторов файлов. Реальное предельное значение содержится в определенной в файле stdio.h константе FOPEN_MAX
и всегда не менее 8, а в ОС Linux обычно 16.
Библиотечная функция fread
применяется для чтения данных из файлового потока. Данные считываются из потока stream
в буфер данных, заданный в параметре ptr
. Функции fread
и fwrite
имеют дело с записями данных. Записи описываются размером size
и количеством передаваемых записей nitems
. Функция возвращает количество записей (а не байтов), успешно считанных в буфер данных. При достижении конца файла может быть возвращено меньше записей, чем nitems
, вплоть до нуля.
Читать дальше