我试图找到一种方法来获取读取或写入可靠流的字符数,即使存在错误并且读取/写入结束时也很短。C++ streambuf方法能抛出异常吗?
我在做这样的事情:
return stream.rdbuf()->sputn(buffer, buffer_size);
但如果overflow
的streambuf实现允许抛出excpections这是不行的。是吗?我无法在任何地方找到它。
我试图找到一种方法来获取读取或写入可靠流的字符数,即使存在错误并且读取/写入结束时也很短。C++ streambuf方法能抛出异常吗?
我在做这样的事情:
return stream.rdbuf()->sputn(buffer, buffer_size);
但如果overflow
的streambuf实现允许抛出excpections这是不行的。是吗?我无法在任何地方找到它。
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)消耗的相关联的输出 序列的字符的效果是specified309
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()
或如果函数失败
不幸的是我正在写一个适配器的streambuf转换为另一种界面(微软COM'IStream')抛出异常。我不控制或实施流缓冲区。 – thehouse
当然,一定有办法做到这一点,但。否则,如果源码流发生错误,源码流如何知道目标码流已消耗了多少字符? – thehouse
@thehouse流操作可能会失败,但您仍然可以调用相应的函数来获取有关流的信息。比如你可以比较可能失败的调用之前和之后的'gptr'的值,或者类似的,它应该在理论上起作用。 –