我能找到的关于重写的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;
。
1条答案
按热度按时间qhhrdooz1#
下面是C++标准对返回值的说明:
[数据流缓冲区虚拟输出]
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()
,则函数可能失败。因此,如果函数无法实际写入底层介质,或者无法恢复不变量,则函数失败。如果它同时管理了这两种情况,则函数成功。