[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 ОБЗОР СТАНДАРТНЫХ БИБЛИОТЕЧНЫХ ФУНКЦИЙ ВВОДА/ВЫВОДА
.    Обеспечивают больше сервиса
.    Могут повысить эффективность
.    Повышают переносимость программ
                Обзор стандартного пакета ввода/вывода

Рисунок на следующей странице иллюстрирует процесс, использующий
стандартный пакет ввода/вывода.
В начале процесс вызвал:      fp = fopen("/tmp/x", "w");

fopen(3S) возвращает указатель на FILE, который присваивается fp. Всем
последующим вызовам библиотечных функций, осуществляющих ввод/вывод с
файлом /tmp/x необходимо указывать fp в качестве аргумента. Поля
структуры FILE, на которую указывает fp, используются и/или
модифицируются библиотечными функциями.
После fopen(3S) были произведены следующие вызовы:
fputc('U', fp);
fputc('N', fp);
fputc('I', fp);
После третьего вызова fputc(), управляющая структура с указателем fp
будет содержать:
_file     файловый дескриптор, который возвращен open(2), вызванной из
          fopen(3S).  Значение   _file  представляет  собой  индекс  в
          таблице файловых  дескрипторов, лежащей  в  пользовательской
          области процесса.

_base     базовый  адрес   буфера  размером   BUFSIZ.  Между  вызовами
          fopen(3S)   и   вызовом   первой   функции   буферизованного
          ввода/вывода можно  вызвать setbuf(3S)  или setvbuf(3S)  для
          изменения режима буферизации. Если в этом нет необходимости,
          первая же  операция ввода/вывода  создаст буфер  при  помощи
          malloc(3C).

_cnt      количество свободных  байт, имеющихся  в буфере,  прежде чем
          write(2) перенесет  данные из буфера в операционную систему.
          Как указано  на рисунка,  три байта  были выведены  в буфер,
          осталось место  еще для 1021 байта. Значение _cnt изменяется
          в пределах от 0 до BUFSIZ. Оно устанавливается равным BUFSIZ
          после вызова _flsbuf().

_ptr      адрес, куда  будет помещен  следующий символ.  Это  значение
          изменяется в  пределах  от  _base  до  _base'+'BUFSIZ.  _ptr
          устанавливается в  0 после  вызова _flsbuf(). Как указано на
          рисунке, U,  N и  I уже  были выведены.  Вызов fputc('X',fp)
          приведет к  тому, что  X будет помещен в позицию, на которую
          указывает _ptr в настоящий момент - 407607, четырьмя байтами
          больше, чем значение _base.