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

时间:2013-09-30 23:39:57

标签: c++ exception iostream

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

我做的是这样的事情:

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

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

1 个答案:

答案 0 :(得分:5)

27.6.3.4.5 / 6 中所述,

basic_streambuf::overflow被允许在失败时抛出异常,遗憾的是没有办法确保编译时该函数不会抛出异常。

好像你运气不好而且唯一可以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 ()如果函数失败则抛出异常