iostream 實現中的差異

從 Visual C++ .NET 2003 開始,移除了舊的 iostream 庫。

標準 C++ 庫和以前的運行時庫之間的主要差異在於 iostream 庫。iostream 實現的具體細節已經更改,如果想鏈接標準 C++ 庫,可能有必要重寫代碼中使用 iostream 的部分。

必須移除任何包含在代碼中的舊 iostream 頭文件(fstream.h、iomanip.h、ios.h、iostream.h、istream.h、ostream.h、streamb.h 和 strstrea.h),並添加一個或多個新的標準 C++ iostream 頭文件(<fstream>、<iomanip>、<ios>、<iosfwd>、<iostream>、<istream>、<ostream>、<sstream>、<streambuf> 和 <strstream>,所有頭文件都沒有 .h 擴展名)。

下表描述新的標準 C++ iostream 庫不同於舊 iostream 庫的行爲。

在新的標準 C++ iostream 庫中: 

open 函數不採用第三個參數(保護參數)。 
無法從文件句柄創建流。 
除了幾個例外,新的標準 C++ 庫中的所有名稱都在 std 命名空間中。有關更多信息,請參見使用 C++ 庫頭。 
單獨用 ios::out 標誌無法打開 ofstream 對象。ios::out 標誌必須在邏輯 OR 中和另一個 ios 枚舉數組合;比如,和 ios::in 或 ios::app 組合。 
因爲設置了 eofbit 狀態,到達文件尾後 ios::good 不再返回非零值。 
除非知道當前沒有設置基標誌,否則 ios::setf(_IFlags) 不應和 ios::dec、ios::oct 或 ios::hex 的標誌值一起使用。格式化的輸入/輸出函數和運算符假定只設置了一個基。改用 ios_base。例如,setf( ios_base::oct, ios_base::basefield ) 清除所有基信息並將基設置成八進制。 
ios::unsetf 返回 void 而不是以前的值。 
若出現錯誤,istream::get( char& _Rch ) 不分配給 Rch。 
istream::get( char* _Pch, int _Ncount, char _Delim ) 有三點不同: 
沒讀取任何內容時設置 failbit。 
提取的字符後總是存儲一個 eos(與結果無關)。 
值爲 -1 時 _Ncount 是一個錯誤。 
具有無效參數的 istream::seekg 不設置 failbit。 
返回類型 streampos 是具有重載運算符的類。在返回 streampos 值(比如 istream::tellg、ostream::tellp、strstreambuf::seekoff 和 strstreambuf::seekpos)的函數中,應將返回值轉換成所需的類型:streamoff、fpos_t 或 mbstate_t。 
strstreambuf::strstreambuf( _Falloc, _Ffree ) 中的第一個函數參數採用 size_t 參數而不是 long。 
除了上述改動外,以下作爲舊 iostream 庫元素的函數、常數和枚舉數不是新 iostream 庫的元素: 

filebuf、fstream ifstream 和 ofstream 的 attach 成員函數 
filebuf、fstream ifstream 和 ofstream 的 fd 成員函數 
filebuf::openprot 
filebuf::setmode 
ios::bitalloc 
ios::nocreate 
ios::noreplace 
ios::sync_with_stdio 
streambuf::out_waiting 
streambuf::setbuf(相同的行爲使用 rdbuf -> pubsetbuf) 


http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_differences_in_iostream_implementation.asp

發佈了71 篇原創文章 · 獲贊 0 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章