代码之家  ›  专栏  ›  技术社区  ›  RSSB

K&R Fopen和Fillbuf

  •  1
  • RSSB  · 技术社区  · 6 年前

    我有一个关于堆栈溢出的其他问题的问题: segmentation fault on c K&R fopen and fillbuf . 在这个问题中,我们讨论了结构中的标志。它们用作不同的访问模式。但在枚举标志中,有一些特定的标志值。所以“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 回复  |  直到 6 年前
        1
  •  3
  •   rici    6 年前

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

    因此

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

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