[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Обзор - стандартные функции ввода/вывода

Стандартные библиотечные функции ввода/вывода, написанные на основе
системных вызовов, предоставляют больше возможностей и большую
функциональность. Например, эти функции позволяют вводить и выводить:
.    символ
.    строку
.    данные определенного формата (с преобразованием)
.    многочисленные структуры, содержащие двоичные и/или символьные
данные
Библиотечные функции ввода/вывода минимизируют количество системных
вызовов буферизацией вводимых и выводимых данных. Схема буферизации
предполагает перенос данных из буфера сегмента данных программы во
вторичный буфер. Вторичный буфер по умолчанию имеет размер BUFSIZ,
определенный в <stdio.h>. Когда вторичный буфер становится полным при
выводе или пустым при вводе, производится необходимый системный вызов.
Системный вызов write(2) производит запись вторичного буфера в
системный буфер, который, в конце концов, попадает на устройство
вывода. read(2), в свою очередь, переносит данные из устройства ввода
в системный буфер, оттуда - в пользовательский буфер. Из этого буфера
символы попадают в обычно меньший по размерам буфер, предоставляемый
стандартными библиотечными функциями ввода/вывода.
Замечания по поводу стандартных библиотечных функций ввода/вывода:
  1. Буфер  будет  выведен  только  если  он  полон,  или  при  вызове
     fflush(3C).

  2. Файловые  потоки могут  быть  строчно-буферизованы.  Тогда  буфер
     выводится при записи признака новой строки, при полном буфере или
     при запросе  ввода. По  умолчанию,  вывод  на  терминал  является
     строчно-буферизованным. Это относится и к устройству стандартного
     вывода.

  3. Файловые потоки могут быть небуферизованы. Стандартное устройство
     сообщений об ошибках небуферизовано.

  4. Смотрите  описание setbuf(3S)  чтобы узнать,  как сделать  потоки
     небуферизованными. Размер  используемого  потоком  буфера  нельзя
     изменить вызовом  setbuf(3S).  setvbuf(3S)  предоставляет  больше
     возможностей, чем setbuf(3S), например, изменение размера буфера.

Программы, использующие стандартные функции ввода/вывода являются
более переносимыми. Для переноса такой программы необходимо лишь
заменить вызовы системных функций в библиотечных вызовах. Сам текст на
Си может не потребовать никакой переработки.
В общем, лучше использовать не системные вызовы ввода/вывода, а
библиотечные функции. Во многих случаях это эффективнее, в частности -
при переносе небольших порций данных. Только при переносе данных
блоками или больше выгоднее использовать системные вызовы read(2) и
write(2).
Список стандартных функций ввода/вывода приведен в конце данного
раздела.