Язык программирования Си



         

Нижний уровень ввода-вывода (read и write) - часть 2


Полезно рассмотреть, как используются read и write при написании программ более высокого уровня — таких как getchar, putchar и т. д. Вот, к примеру, версия программы getchar, которая осуществляет небуферизованный ввод, читая по одному символу из стандартного входного потока.

#include "syscalls.h" /* getchar: небуферизованный ввод одного символа */ int getchar(void) { char с; return (read(0, &c, 1) == 1) ? (unsigned char) с : EOF; }

Переменная c должна быть типа char, поскольку read требует указателя на char. Приведение c к unsigned char перед тем, как вернуть ее в качестве результата, исключает какие-либо проблемы, связанные с распространением знака.

Вторая версия getchar осуществляет ввод большими кусками, но при каждом обращении выдает только один символ.

#include "syscalls.h"

/* getchar: простая версия с буферизацией */ int getchar(void) { static char buf[BUFSIZ]; static char *bufp = buf; static int n = 0;

if (n == 0) { /* буфер пуст */ n = read(0, buf, sizeof buf); bufp = buf; } return (--n >= 0) ? (unsigned char) *bufp++ : EOF; }

Если приведенные здесь версии функции getchar компилируются с включением заголовочного файла <stdio.h> и в этом заголовочном файле getchar определена как макрос, то нужно задать строку #undef с именем getchar.




Содержание  Назад  Вперед