我正在尝试找到一种方法来获取读取或写入到可靠流中的字符数,即使出现错误并且读/写结束很短。
我正在做这样的事情:
return stream.rdbuf()->sputn(buffer, buffer_size);
但是如果允许 streambuf 的实现overflow
抛出异常,这将不起作用。是吗?我无法在任何地方找到它的记录。
basic_streambuf::overflow
允许在失败时抛出异常,如27.6.3.4.5/6中所述,遗憾的是,无法确保函数在编译时不会抛出异常。
似乎你的运气已经不多了,100% 确保overflow
不会抛出异常的唯一方法是编写你自己的streambuf
,在失败时不会这样做。
[ 27.6.3.4.5/2-3 ] ...
int_type overflow(int_type = c = traits::eof ())
[ 27.6.3.4.5/5 ]
要求:此虚函数的每个覆盖定义都应遵守以下约束:
1) 指定消费一个字符对相关输出序列的影响309
2) 令 r 为待处理序列中未消耗的字符数。如果 r 不为零,则应设置 pbase() 和 pptr(),以便: pptr() - pbase() == r 并且以 pbase() 开始的 r 字符是相关的输出流。如果 r 为零(已使用待处理序列的所有字符),则 pbase() 设置为 NULL,或者 pbase() 和 pptr() 都设置为相同的 NULL 非值。
3) 如果将某些字符附加到关联的输出流失败或无法根据上述规则建立 pbase() 和 pptr(),则该函数可能会失败。
[ 27.6.3.4.5/6 ]
返回:如果函数失败
traits::eof ()
则抛出异常