今天在寫一個文件讀寫操作得時候,發(fā)現(xiàn)知識體現(xiàn)嚴重混亂,沒辦法忙寫,都是借助百度才搞定的。為此下午決定好好的總結一下c++標準io庫的相關知識,用自己平時將ppt的思路來寫整理這個文檔。
1.標準IO庫是什么東西?
C++的輸入輸出庫由標準庫(標準庫是什么東西就不解釋了)提供。標準庫定義了一族類型,支持對文件和控制窗口(如我們通常看到的屏幕輸出,或者黑窗口吧)等設備的讀寫。還定義了其他一些類型,使string對象能夠像文件一樣操作,從而使我們無須IO就能實現(xiàn)數(shù)據(jù)與字符之間的轉(zhuǎn)換(待會會介紹)。這些IO類型都定義了如何讀寫內(nèi)置數(shù)據(jù)類型的值,相信有不少人會對內(nèi)置數(shù)據(jù)類型有些混亂,貼出c++的內(nèi)置數(shù)據(jù)類型如下,也就是說標準IO庫可以讀寫以下類型的值,是不是很酷啊,一般來說也可以讀寫自定義類的對象,那要看自己自定義類是怎么設計的了,反正不管是什么類也都是一大堆的內(nèi)置類型搭起來的。
類型
大?。ㄗ止?jié))
值
bool
1
true 或者false
unsigned short int
2
0~65535
short int
2
-32768~32767
unsigned long int
4
0~4294967395
long int
4
-2147483648~2147483647
int
4
-2147483648~2147483647
unsigned int
4
0~4294967395
char
1
256 個字符
wchar_t
2
256 個字
float
4
10-37~1038
double
8
10-307~10308
long double
16
10-4931~104932
繼續(xù)...
2.在這里先總結一下我們能拿io標準庫做什么事情?
與用戶控制窗口交互(控制窗口)讀寫已命名的文件??(磁盤文件)使用io操作格式化內(nèi)存中的數(shù)據(jù)(內(nèi)存)
不管我們是從控制窗口、磁盤文件或內(nèi)存中的字符串讀入數(shù)據(jù),都可以使用>>操作符。
不管我們讀的是char類型的字符還是wchar_t的字符,也都可以使用該操作符。
3.開始進入正題,標準IO庫的繼承關系
平時在使用io庫的時候,就是因為沒有了解他們的繼承關系和使用場合導致無法系統(tǒng)的記憶,現(xiàn)在我們先看下一共有多少種常用的類
io類型在三個獨立的頭文件定義,分別完成2中要做的三個事情(控制窗口、磁盤文件、內(nèi)存)
iostream:定義讀寫控制窗口的類型fstream:定義讀寫已命名文件的類型。sstream:讀寫內(nèi)存中string對象注意:在fstream和sstream里定義的每種類型都是從iostream頭文件中定義的相關類型派生出來,先來看一個圖大概了解一下標準io庫的成員
iostream
istream 從流中讀取?
ostream 寫到流中去?
iostream 對流進行讀寫;從 istream 和 ostream 派生而來
fstream
ifstream 從文件中讀取;由 istream 派生而來?
ofstream 寫到文件中去;由 ostream 派生而來?
fstream 讀寫文件;由 iostream 派生而來
sstream
istringstream 從 string 對象中讀取;由 istream 派生而來?
ostringstream 寫到 string 對象中去;由 ostream 派生而來?
stringstream 對 string 對象進行讀寫;由 iostream 派生而來
粗略的用工具畫一下繼承關系
結合表格和圖來進行記憶,爭取以后寫代碼的時候不要在百度了。
io庫使用繼承有一個主要的用處在于,如果函數(shù)有基類類型的引用形參時,可以給函數(shù)傳遞其派生類型的對象。如對istream&進行操作的對象,可以使用ifstream或者istringstream對象來調(diào)用。類似的ostream同上
4.國際字符的支持
在讀寫wchar_t時,所有類前面加上w,如
wostream、wistream、wiostream控制窗口讀寫
wofstream、wifstream、wfstream控制文件讀寫
wostringstream、wistringstream、wstringstream控制內(nèi)存讀寫
每一個 IO 頭文件都定義了 char 和 wchar_t 類型的類和標準輸入/輸出對象。基于流的 wchar_t 類型的類和對象在 iostream 中定義,寬字符文件流類型在 fstream 中定義,而寬字符 stringstream 則在 sstream 頭文件中定義。
5.IO對象不可復制
io對象的不可復制,產(chǎn)生了幾個問題
由于流對象不能復制,因此不能存儲在 vector(或其他)容器中(即不存在存儲流對象的 vector 或其他容器)。形參或返回類型也不能為流類型。如果需要傳遞或返回 IO對象,則必須傳遞或返回指向該對象的指針或引用:
6.條件狀態(tài)
通常我們在使用io庫的時候會出現(xiàn)各種異常,通過以下函數(shù)可以獲取條件狀態(tài)