2013-09-30 95 views
5

我试图找到一种方法来获取读取或写入可靠流的字符数,即使存在错误并且读取/写入结束时也很短。C++ streambuf方法能抛出异常吗?

我在做这样的事情:

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

但如果overflow的streambuf实现允许抛出excpections这是不行的。是吗?我无法在任何地方找到它。

回答

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)消耗的相关联的输出 序列的字符的效果是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()如果函数失败

+0

不幸的是我正在写一个适配器的streambuf转换为另一种界面(微软COM'IStream')抛出异常。我不控制或实施流缓冲区。 – thehouse

+0

当然,一定有办法做到这一点,但。否则,如果源码流发生错误,源码流如何知道目标码流已消耗了多少字符? – thehouse

+1

@thehouse流操作可能会失败,但您仍然可以调用相应的函数来获取有关流的信息。比如你可以比较可能失败的调用之前和之后的'gptr'的值,或者类似的,它应该在理论上起作用。 –