2012-04-11 59 views
1

我想使用ifstream從指定的管道讀取數據。我想用它的操作符>>來讀取格式化數據(通常是一個int)。 但是,我對錯誤處理的工作方式有些困惑。ifstream operator >>和錯誤處理

想象一下,我想讀取一個int,但只有3個字節可用。錯誤位將被設置,但是這3個字節會發生什麼?他們會「消失」嗎,他們會被放回到流中以便以後提取?

感謝,

+3

'operator >>'不會讀取一個(四字節,或其他)二進制整數。它將讀取整數的文本表示。 – 2012-04-11 18:09:47

+0

嗯,我想這解決了我的問題...任何關於如何手動處理的建議?如果read()沒有讀取至少4個字節,我可以使用putback()方法稍後再試一次嗎?如果是這樣,手動創建我的int使用這4個字節? – Xaqq 2012-04-11 18:17:28

+1

事實上,這就是'格式化'在這種情況下的含義。如果你想讀取_binary_數據,那就是'無格式輸入'。 – ildjarn 2012-04-11 18:17:41

回答

1

正如已經指出的那樣,你不能在一個istream讀取二進制數據。 但關於可用的字節發行數量(因爲你 可能想使用basic_ios<char>streambuf爲您的二進制 流):istreamostream使用streambuf的實際 採購和下沉的字節。而streambuf正常緩衝區: 程序是:如果一個字節的緩衝區,返回它,否則,儘量 重新加載緩存,等待直到重裝完成後,或 決定性失敗。如果確定失敗,則返回文件結尾,並終止輸入; istream將 記住文件的結尾,而不是嘗試任何更多的輸入。因此,如果您正在讀取的 類型需要四個字節,它將請求 streambuf中的四個字節,並且通常會一直等到這四個字節爲 那裏。沒有錯誤將被設置(因爲沒有錯誤);你會 只是不會從operator>>返回,直到這四個字節到達。

如果您實現自己的二進制流,我會強烈建議使用 使用相同的模式;它將允許直接使用已有的 標準組件,例如std::ios_base和(可能)std::filebuf, ,並將爲其他程序員提供他們熟悉的習慣用法。 如果阻塞是一個問題,最簡單的解決方案就是在單獨的線程中運行 輸入,通過消息隊列或 進行類似的通信。 (Boost支持異步IO,這樣就避免了線程,但是在全局上要複雜得多,並且與傳統流成語不符合 )。