C++ streambuf方法可以抛出异常吗?

the*_*use 5 c++ iostream exception

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

我做的是这样的:

return stream.rdbuf()->sputn(buffer, buffer_size);
Run Code Online (Sandbox Code Playgroud)

但如果overflow允许streambuf实现抛出激励,这将无效.是吗?我无法在任何地方找到它.

Fil*_*efp 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 ()或者如果函数失败则抛出异常