我正在尝试找到一种方法来获取读取或写入可靠流的字符数,即使出现错误且读/写结束时也是如此。
我做的是这样的事情:
return stream.rdbuf()->sputn(buffer, buffer_size);
但是如果允许overflow
的streambuf实现抛出激励,那么这将无效。是吗?我无法在任何地方找到它。
答案 0 :(得分:5)
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 ()
或如果函数失败则抛出异常