2013-09-30 134 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'的值,或者類似的,它應該在理論上起作用。 –