[<<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.