Язык С




Низкоуровневый ввод/вывод - операторы READ и WRITE - часть 2


Если размер файла не будет кратен BUFSIZE, то при некотором обращении к READ будет возвращено меньшее число байтов, ко- торые затем записываются с помощью WRITE; при следующем пос- ле этого обращении к READ будет возвращен нуль. Поучительно разобраться, как можно использовать функции READ и WRITE для построения процедур более высокого уровня, таких как GETCHAR, PUTCHAR и т.д. Вот, например, вариант функции GETCHAR, осуществляющий ввод без использования буфе- ра.

#DEFINE CMASK 0377 /*FOR MAKING CHAR'S > 0*/ GETCHAR() /*UNBUFFERED SINGLE CHARACTER INPUT*/ \( CHAR C; RETURN((READ(0,&C,1)>0 7 & CMASK : EOF); \)

Переменная "C" должна быть описана как CHAR, потому что фун- кция READ принимает указатель на символы. Возвращаемый сим- вол должен быть маскирован числом 0377 для гарантии его по- ложительности; в противном случае знаковый разряд может сде- лать его значение отрицательным. (Константа 0377 подходит для эвм PDP-11, но не обязательно для других машин). Второй вариант функции GETCHAR осуществляет ввод больши- ми порциями, а выдает символы по одному за обращение.

#DEFINE CMASK 0377 /*FOR MAKING CHAR'S>0*/ #DEFINE BUFSIZE 512 GETCHAR() /*BUFFERED VERSION*/ \( STATIC CHAR BUF[BUFSIZE]; STATIC CHAR *BUFP = BUF; STATIC INT N = 0; IF (N==0) \( /*BUFFER IS EMPTY*/ N=READ(0,BUF,BUFSIZE); BUFP = BUF; \) RETURN((--N>=0) ? *BUFP++ & CMASK : EOF); \)




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