5

我正在尝试找到一种方法来获取读取或写入到可靠流中的字符数,即使出现错误并且读/写结束很短。

我正在做这样的事情:

return stream.rdbuf()->sputn(buffer, buffer_size);

但是如果允许 streambuf 的实现overflow抛出异常,这将不起作用。是吗?我无法在任何地方找到它的记录。

4

1 回答 1

5

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 ()抛出异常

于 2013-10-01T00:04:35.280 回答