您好,登錄后才能下訂單哦!
我們從一開(kāi)始就一直在利用C++的輸入輸出在做著各種練習(xí),輸入輸出是由iostream庫(kù)提供的,所以討論此標(biāo)準(zhǔn)庫(kù)是有必要的,它與C語(yǔ)言的stdio庫(kù)不同,它從一開(kāi)始就是用多重繼承與虛擬繼承實(shí)現(xiàn)的面向?qū)ο蟮膶哟谓Y(jié)構(gòu),作為一個(gè)c++的標(biāo)準(zhǔn)庫(kù)組件提供給程序員使用。
iostream為內(nèi)置類型類型對(duì)象提供了輸入輸出支持,同時(shí)也支持文件的輸入輸出,類的設(shè)計(jì)者可以通過(guò)對(duì)iostream庫(kù)的擴(kuò)展,來(lái)支持自定義類型的輸入輸出操作。
為什么說(shuō)要擴(kuò)展才能提供支持呢?我們來(lái)一個(gè)示例。
#include#includeusing namespace std; class Test { public: Test(int a=0,int b=0) { Test::a=a; Test::b=b; } int a; int b; }; int main() { Test t(100,50); printf("%???",t);//不明確的輸出格式 scanf("%???",t);//不明確的輸入格式 cout<<1t<1<1endl; 同樣不夠明確="" cin>>t;//同樣不夠明確 system("pause"); }
由于自定義類的特殊性,在上面的代碼中,無(wú)論你使用c風(fēng)格的輸入輸出,或者是c++的輸入輸出都不是不明確的一個(gè)表示,由于c語(yǔ)言沒(méi)有運(yùn)算符重載機(jī)制,導(dǎo)致stdio庫(kù)的不可擴(kuò)充性,讓我們無(wú)法讓printf()和scanf()支持對(duì)自定義類對(duì)象的擴(kuò)充識(shí)別,而c++是可以通過(guò)運(yùn)算符重載機(jī)制擴(kuò)充iostream庫(kù)的,使系統(tǒng)能能夠識(shí)別自定義類型,從而讓輸入輸出明確的知道他們?cè)摳墒裁?,格式是什么? 在上例中我們之所以用printf與cout進(jìn)行對(duì)比目的是為了告訴大家,C與C++處理輸入輸出的根本不同,我們從c遠(yuǎn)的輸入輸出可以很明顯看出是函數(shù)調(diào)用方式,而c++的則是對(duì)象模式,cout和cin是ostream類和istream類的對(duì)象。 C++中的iostream庫(kù)主要包含下圖所示的幾個(gè)頭文件:
我們所熟悉的輸入輸出操作分別是由istream(輸入流)和ostream(輸出流)這兩個(gè)類提供的,為了允許雙向的輸入/輸出,由istream和ostream派生出了iostream類。 類的繼承關(guān)系見(jiàn)下圖:
iostream庫(kù)定義了以下三個(gè)標(biāo)準(zhǔn)流對(duì)象:
1.cin,表示標(biāo)準(zhǔn)輸入(standard input)的istream類對(duì)象。cin使我們可以從設(shè)備讀如數(shù)據(jù)。 2.cout,表示標(biāo)準(zhǔn)輸出(standard output)的ostream類對(duì)象。cout使我們可以向設(shè)備輸出或者寫數(shù)據(jù)。 3.cerr,表示標(biāo)準(zhǔn)錯(cuò)誤(standard error)的osttream類對(duì)象。cerr是導(dǎo)出程序錯(cuò)誤消息的地方,它只能允許向屏幕設(shè)備寫數(shù)據(jù)。
輸出主要由重載的左移操作符(<<)來(lái)完成,輸入主要由重載的右移操作符(>>)完成。
>>a表示將數(shù)據(jù)放入a對(duì)象中。
<<1a表示將a對(duì)象中存儲(chǔ)的數(shù)據(jù)拿出。<1 p="" style="-webkit-tap-highlight-color: transparent; box-sizing: border-box;">
這些標(biāo)準(zhǔn)的流對(duì)象都有默認(rèn)的所對(duì)應(yīng)的設(shè)備,見(jiàn)下表:
圖中的意思表明cin對(duì)象的默認(rèn)輸入設(shè)備是鍵盤,cout對(duì)象的默認(rèn)輸出設(shè)備是顯示器屏幕。 那么原理上C++有是如何利用cin/cout對(duì)象與左移和右移運(yùn)算符重載來(lái)實(shí)現(xiàn)輸入輸出的呢?
下面我們以輸出為例,說(shuō)明其實(shí)現(xiàn)原理: cout是ostream類的對(duì)象,因?yàn)樗赶虻氖菢?biāo)準(zhǔn)設(shè)備(顯示器屏幕),所以它在iostream頭文件中作為全局對(duì)象進(jìn)行定義。
ostream cout(stdout);//其默認(rèn)指向的C中的標(biāo)準(zhǔn)設(shè)備名,作為其構(gòu)造函數(shù)的參數(shù)使用。
在iostream.h頭文件中,ostream類對(duì)應(yīng)每個(gè)基本數(shù)據(jù)類型都有其友元函數(shù)對(duì)左移操作符進(jìn)行了友元函數(shù)的重載。
ostream& operator<<(ostream &temp,int source);
ostream& operator<<(ostream &temp,char *ps);
。。。。等等
一句輸出語(yǔ)句:cout<<"www.cndev-lab.com";,事實(shí)上調(diào)用的就是ostream& operator<<(ostream &temp,char *ps);這個(gè)運(yùn)算符重載函數(shù),由于返回的是流對(duì)象的引用,引用可以作為左值使用,所以當(dāng)程序中有類似cout<<"www.cndev-lab.com"<<"中國(guó)軟件開(kāi)發(fā)實(shí)驗(yàn)室";這樣的語(yǔ)句出現(xiàn)的時(shí)候,就能夠構(gòu)成連續(xù)輸出。
由于iostream庫(kù)不光支持對(duì)象的輸入輸出,同時(shí)也支持文件流的輸入輸出,所以在詳細(xì)講解左移與右移運(yùn)算符重載只前,我們有必要先對(duì)文件的輸入輸出以及輸入輸出的控制符有所了解。 和文件有關(guān)系的輸入輸出類主要在fstream.h這個(gè)頭文件中被定義,在這個(gè)頭文件中主要被定義了三個(gè)類,由這三個(gè)類控制對(duì)文件的各種輸入輸出操作,他們分別是ifstream、ofstream、fstream,其中fstream類是由iostream類派生而來(lái),他們之間的繼承關(guān)系見(jiàn)下圖所示。
由于文件設(shè)備并不像顯示器屏幕與鍵盤那樣是標(biāo)準(zhǔn)默認(rèn)設(shè)備,所以它在fstream.h頭文件中是沒(méi)有像cout那樣預(yù)先定義的全局對(duì)象,所以我們必須自己定義一個(gè)該類的對(duì)象,我們要以文件作為設(shè)備向文件輸出信息(也就是向文件寫數(shù)據(jù)),那么就應(yīng)該使用ofstream類。
ofstream類的默認(rèn)構(gòu)造函數(shù)原形為:
ofstream::ofstream(const char *filename,int mode = ios::out,int openprot = filebuf::openprot);
filename: 要打開(kāi)的文件名
mode: 要打開(kāi)文件的方式
prot: 打開(kāi)文件的屬性
其中mode和openprot這兩個(gè)參數(shù)的可選項(xiàng)表見(jiàn)下表:
mode屬性表
ios::app: 以追加的方式打開(kāi)文件
ios::ate: 文件打開(kāi)后定位到文件尾,ios:app就包含有此屬性
ios::binary: 以二進(jìn)制方式打開(kāi)文件,缺省的方式是文本方式。兩種方式的區(qū)別見(jiàn)前文 ios::in: 文件以輸入方式打開(kāi)
ios::out: 文件以輸出方式打開(kāi)
ios::trunc: 如果文件存在,把文件長(zhǎng)度設(shè)為0
可以用“或”把以上屬性連接起來(lái),如ios::out|ios::binary。
openprot屬性表:
0:普通文件,打開(kāi)訪問(wèn)
1:只讀文件
2:隱含文件
4:系統(tǒng)文件
可以用“或”或者“+”把以上屬性連接起來(lái) ,如3或1|2就是以只讀和隱含屬性打開(kāi)文件。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。