2013-04-01 79 views
1

在GameDev.net上閱讀this post後,我決定採用C++標準。有幾個std::istream函數被標準描述爲「無格式輸入函數」(如tellg(),read()等)。我一直認爲「無格式輸入功能」意味着當使用「無格式輸入功能」(無論文本模式還是二進制模式)時,文本在讀取時不會被格式化(例如,"\r\n" -> "\n")。顯然,情況並非如此,因爲read()方法仍將轉換爲"\r\n" -> "\n"(如果未指定std::ios_base::binary),儘管它是「未格式化的輸入函數」。「無格式輸入函數」究竟意味着什麼?

現在我都很困惑,因爲我顯然不明白事情是正確的。 「無格式輸入功能」究竟意味着什麼?是的,我已閱讀第27.7.2.3節第1段,它似乎談論更多關於處理錯誤的事情(儘管當然,可能我沒有正確理解它,這可能是問題的一部分) 。

我剛剛發現tellg()沒有考慮到格式轉換的事實,而read()確實是相當混亂。在某種程度上,它是有意義的(因爲tellg()如果是的話就是O(n),如果read()沒有,那麼文本/二進制模式之間的差異將遠不那麼重要)。但在另一種程度上,似乎......不一致。我認爲我的一部分困惑和觀察到的不一致可能來自我對「無格式輸入函數」的明顯誤解。

回答

2

未格式化的函數意味着該函數將該流視爲char的一個序列,即使它是doubleint。例如,如果流具有8.7,則未格式化的函數read將將其作爲'8','.','7'的序列讀取,並將它們存儲在char*類型的緩衝區中。

另一方面,格式化的函數將嘗試將未格式化的緩衝區格式化爲給定類型。如果給定類型是double,那麼您將獲得8.7。如果未格式化的數據無法格式化爲給定類型,則該函數將設置流狀態爲failbit

+1

啊,我在攪拌東西,我明白了。感謝您的明確和簡單的澄清! – Cornstalks

相關問題