k& r fopen和fillbuf

时间:2018-05-30 06:58:30

标签: c fopen

我对有关堆栈溢出的其他问题有疑问: - segmentation fault on c K&R fopen and fillbuf。在这个问题中,讨论了struct _iobuf中的标志。这些用作不同的访问模式。但是在这里枚举标志中有一些特定的标志值。所以将会标记'只取这些特定值或这些是一些标准值,而flag也可以采取其他一些值?我怀疑的是,在定义数组_iob时,只给出了三个标准值(对于stdin,stdout,stderr)(20个中),因此fp也可以采用其他一些值(同时另外17个) 。第二个疑问是,如果flag只能取(_READ,_WRITE等)定义的值,那么在int _fillbuf()函数中代替写入

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

我们可以写为

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

因为在给定的固定标志值之外,它仍然有意义。

1 个答案:

答案 0 :(得分:1)

枚举值是标志位,flag成员可以设置其中几个。 (并非所有组合都有意义,但很多组合; __READ__EOF__ERR标志彼此独立,并且所有八种组合都是可能的。)。

因此

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

测试文件是否已打开以供阅读,并且既没有设置错误也没有设置EOF标志。