k & r fopen и fillbuf - PullRequest
       8

k & r fopen и fillbuf

0 голосов
/ 30 мая 2018

У меня есть вопрос относительно другого вопроса, задаваемого при переполнении стека: - ошибка сегментации на c K & R fopen и fillbuf .В этом вопросе идет обсуждение флагов в struct _iobuf.Они используются в качестве разных режимов доступа.Но здесь, в enum flags, есть некоторые конкретные значения флагов.Так будет ли 'flag' принимать только эти конкретные значения, или это некоторые стандартные значения, тогда как flag может принимать и некоторые другие значения?Мое сомнение возникает из-за того, что при определении массива _iob были заданы только три стандартных значения (для stdin, stdout, stderr) (из 20), поэтому fp может принимать и некоторые другие значения (17 других одновременно),Второе сомнение заключается в том, что если флаг может принимать только определенные значения, такие как (_READ, _WRITE и т. Д.), То в функции int _fillbuf () вместо записи

if((fp->flag & (_READ|_EOF|_ERR))!=_READ)

мы можем записать как

if((fp->flag==_WRITE || fp->flag== _UNBUF))

потому что из заданных фиксированных значений флага это все еще имеет смысл.

1 Ответ

0 голосов
/ 30 мая 2018

Значения перечисления являются битами флага, и элемент flag может иметь несколько из них установленных.(Не все комбинации имеют смысл, но многие из них; флаги __READ, __EOF и __ERR не зависят друг от друга, и возможны все восемь комбинаций.).

Следовательно

if((fp->flag & (_READ|_EOF|_ERR))!=_READ)

Проверяет, открыт ли файл для чтения и не установлены ни ошибки, ни флаги EOF.

...