c++ 健全性检查:从streambuf派生类的溢出函数返回! EOF有意义吗?

kgsdhlau  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(118)

我能找到的关于重写的std::streambuf::overflow函数应该如何简单地获取写入流的每个字符的有用信息非常少。所以我向ChatGPT请求一些指针。它不断地回到这个概念:

int overflow(int c)
{
    if (c == EOF)
    {
        // Flush the buffer here
        return !EOF;
    }
    // Put c in the buffer here
    if (c == '\n')
    {
        // Flush the buffer here
    }
    return c;
}

当c是EOF的时候,它返回!EOF,这非常奇怪。
不要详述“成功”的含义。
This page表示,当使用EOF作为参数调用时(或发出“失败”信号时),它应该返回EOF(而不是!EOF)。
那么:我的怀疑是正确的吗?在这里返回!EOF是错误的,我应该返回EOF
如果你能告诉我ChatGPT是从哪里得到这个想法的,我在互联网上找不到return !EOF;

qhhrdooz

qhhrdooz1#

下面是C++标准对返回值的说明:

[数据流缓冲区虚拟输出]

int_type overflow(int_type c = traits::eof());

6返回:traits::eof()或在函数失败时引发异常。

否则,返回traits::eof()以外的某个值以指示成功。
(脚注304)通常,overflow返回c以指示成功,除非traits::eq_int_type(c, traits::eof())返回true,在这种情况下,它返回traits::not_eof(c)
因此,具体的返回值并不重要,重要的是它是否为traits::eof(),您可能需要遵循一个(非规范的)约定。
回复:“成功”的含义:

[streambuf.virt.put]/5要求: 此虚函数的每个重写定义都应遵守以下约束:

...
1.设r为待定序列中未使用的字符数,如果r非零,则pbase()pptr()应设置为:pptr() - pbase() == r和从pbase()开始的r字符是关联的输出流。如果r是零(未决序列的所有字符都已被消耗),则pbase()被设置为nullptr,或者pbase()pptr()都被设置为相同的非空值。
1.如果向关联的输出流追加某些字符失败,或者无法根据上述规则建立pbase()pptr(),则函数可能失败。
因此,如果函数无法实际写入底层介质,或者无法恢复不变量,则函数失败。如果它同时管理了这两种情况,则函数成功。

相关问题