我試圖找到一種方法來獲取讀取或寫入可靠流的字符數,即使存在錯誤並且讀取/寫入結束時也很短。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'的值,或者類似的,它應該在理論上起作用。 –