8.2. И нтерфейсы файлового ввода-вывода 377
Для символьных данных из ограниченного набора символов используются байтовые
символы, или тип char. Функции ввода входных данных в байтовые символы и байтовые
строки включают fgetc ( ) , fgets ( ) , ge tc ( ) , ge tchar ( ) , fscan f ( ) , scan f ( ) , vfs can f ( )
и vscanf ( ) .
Функции вывода из байтовых символов и байтовых строк включают fputc ( ) , fputs ( ) ,
putc ( ) , putcha r ( ) , fpr in t f ( ) , fpr in t f ( ) , vfprint f ( ) и vprintf ( ) .
Функции байтового ввода-вывода представляют собой объединение функции ungetc ( ) ,
функций байтового ввода и байтового вывода.
Для символьных данных естественных языков используются широкие символы, или
тип wchar t.
Широкосимвольные функции ввода выполняют ввод входных данных в широкие
символы и широкие строки: fgetwc ( ) , fgetws ( ) , getwc ( ) , getwchar ( ) , fws canf ( ) ,
ws can f ( ) , vfws canf ( ) и vws can f ( ) .
Широкосимвольные функции вывода выполняют вывод выходных данных из широ
ких символов и широких строк: fputwc ( ) , fputws ( ) , putwc ( ) , putwchar ( ) , fwprint f ( ) ,
wp rint f ( ) , vfwpri n t f ( ) и vwprint f ( ) .
Широкосимвольные функции ввода-вывода представляют собой объединение функции
unge twc ( ) , широкосимвольных функций ввода и широкосимвольных функций вывода.
Поскольку широкосимвольные функции ввода-вывода являются более новыми, при их
разработке внесены определенные усовершенствования по сравнению с байтовыми фун
кциями ввода-вывода.
Потоки даннъrх
Входные и выходные данные отображаются на потоки логических данных, свойства
которых более однородны , чем свойства реальных физических устройств, к которым они
присоединены, таких как терминалы и файлы, поддерживаемые структурированными ус
тройствами хранения.
Поток связывается с внешним файлом путем открытия последнего, причем процесс
связывания может включать создание нового файла. Создание файла в случае, если он уже
существует, приводит к уничтожению всего имевшегося в нем содержимого. Если вызыва
ющий код недостаточно внимателен при указании ограничений, какие файлы могут быть
открытыми, это может привести к непреднамеренной перезаписи существующего файла
или, что еще хуже, злоумышленник может воспользоваться этой уязвимостью для уничто
жения файлов в атакуемой системе.
Файлы, обращение к которым осуществляется посредством механизма FILE, предостав
ленного заголовочным файлом <s tdio . h>, известны как файлы потоков (stream files) .
При инициализации программы открываются три предопределенных потока, которые
в результате не требуется открывать явно.
• s tdin: стандартный ввод (для чтения обычного ввода)
• s tdout: стандартный вывод (для записи обычного вывода)
• s tde rr: стандартные сообщения об ошибках (для записи диагностического вывода)
Текстовые потоки s tdin, s tdout и s tde r r являются выражениями типа указателя на
F I LE. При начальном открытии стандартный поток сообщений об ошибках не является
буферизованным, в отличие от потоков стандартного ввода и вывода, которые являются
полностью буферизованными, если только поток не является интерактивным устройством.
1378 Файловый ввод-вывод
Открытие и закрытие файлов
Функция fopen ( ) открывает файл, имя которого представляет собой строку, на кото
рую указывает аргумент функции, и связывает с ним поток. Функция fopen ( ) имеет сле
дующую сигнатуру.
1 FILE * fopen (
2 const char * re s t rict fi lename ,
3 const cha� * res t rict mode
4 );
Аргумент mode указывает на строку. Если это корректная строка, файл открывается в
указанном режиме; в противном случае поведение функции не определено.
С99 поддерживает следующие режимы.
• r: открытие текстового файла для чтения
• w: усечение текстового файла до нулевого размера или создание текстового файла
для записи
• а: добавление; открытие или создание текстового файла для записи в его конец
• rb: открытие бинарного файла для чтения
11 wb: усечение бинарного файла до нулевого размера или создание бинарного файла
для записи
11 аЬ: добавление; открытие или создание бинарного файла для записи в его конец
• r+: открытие текстового файла для обновления (чтения и записи)
• w+: усечение текстового файла до нулевого размера или создание текстового файла
для обновления
• а+: добавление; открытие или создание текстового файла для обновления путем за
писи в его конец
• r+b или rb+: открытие бинарного файла для обновления ( чтения и записи)
• w+b или wb+: усечение бинарного файла до нулевого размера или создание бинарно
го файла для обновления
11 а+Ь или аЬ+: добавление; открытие или создание бинарнш'о файла для обновления
путем записи в его конец
CERT предложил, а WG 1 4 принял дополнение эксклюзивного режима в C l 1 . Открытие
файла в эксклюзивном (исключительном) режиме (последний символ аргумента режима х)
завершается неудачей, если файл уже существует или не может быть создан. В противном
случае файл создается для эксклюзивного ( известного также как монопольн ый) доступа
к пространству, для которого операционная система поддерживает эксклюзивный доступ.
11 wx: создание текстового файла в эксклюзивном режиме для записи
11 wbx: создание бинарного файла в эксклюзивном режиме для записи
11 w+ x: создание текстового файла в эксклюзивном режиме для обновления
• w+bx или wb+x: создание бинарного файла в эксклюзивном режиме для обновления