簡(jiǎn)介: c++的輸入/輸出(input/output)由標(biāo)準(zhǔn)庫(kù)提供.標(biāo)準(zhǔn)庫(kù)定義了一族類(lèi)型,支持對(duì)文件和控制窗口等設(shè)備的讀寫(xiě).還定義了其他的一些類(lèi)型,使string對(duì)象能夠像文件一樣操作,從而使我們無(wú)須IO就能實(shí)現(xiàn)數(shù)據(jù)與字符之間的轉(zhuǎn)換.這些IO類(lèi)型都定義了如何讀寫(xiě)內(nèi)置數(shù)據(jù)類(lèi)型的值. 組成: IO類(lèi)型在三個(gè)獨(dú)立的頭文件中定義:iostream定義讀寫(xiě)控制窗口的類(lèi)型,fstream定義讀寫(xiě)已命名文件的類(lèi)型,而sstream所定義的類(lèi)型用于讀寫(xiě)存儲(chǔ)在內(nèi)存中的string對(duì)象.圖1列出了c++的IO類(lèi),圖2闡明這些類(lèi)型之間的繼承關(guān)系. 條件狀態(tài): 實(shí)現(xiàn)IO的繼承是錯(cuò)誤發(fā)生的根源。一些錯(cuò)誤是可恢復(fù)的;一下錯(cuò)誤則發(fā)生在系統(tǒng)底層,位于程序可修正的范圍之外。IO標(biāo)準(zhǔn)庫(kù)管理一系列條件狀態(tài)成員,用來(lái)標(biāo)記給定的IO對(duì)象是否處于可用狀態(tài),或者碰到了哪種特定的錯(cuò)誤。表8-2列出了標(biāo)準(zhǔn)庫(kù)定義的一組函數(shù)和標(biāo)記,提供訪問(wèn)和操作流狀態(tài)的手段。 流必須處于無(wú)錯(cuò)誤狀態(tài),才能用于輸入或輸出。檢測(cè)流是否可用的最簡(jiǎn)單的方法是檢測(cè)其真值: if(cin) //ok to use cin,it is in a valid state While(cin>>word) //ok:read operation successful… 雖然許多程序只需要知道流是否有效,但某些程序則需要更詳細(xì)地訪問(wèn)or控制流的狀態(tài),此時(shí),除了知道流處于錯(cuò)誤狀態(tài)外,還必須了解它遇到了那種類(lèi)型的錯(cuò)誤。例如,程序員也許希望弄清楚是到達(dá)了文件的結(jié)尾,還是遇到了IO設(shè)備上的錯(cuò)誤。 所有流對(duì)象都包含一個(gè)條件狀態(tài)成員,該成員由setstate和clear操作管理。這個(gè)狀態(tài)成員為iostate類(lèi)型,這是由各個(gè)iostream類(lèi)分別定義的機(jī)器相關(guān)的整形。該狀態(tài)成員以二進(jìn)制為的形式使用。 Badbit標(biāo)志著系統(tǒng)級(jí)的故障,如無(wú)法恢復(fù)的讀寫(xiě)錯(cuò)誤。如果出現(xiàn)了這類(lèi)錯(cuò)誤,則該流通常就不能在繼續(xù)使用了。如果出現(xiàn)的是可恢復(fù)的錯(cuò)誤,如在希望獲得數(shù)值型數(shù)據(jù)時(shí)輸入了字符,此時(shí)則設(shè)置failbit標(biāo)志,這種導(dǎo)致設(shè)置failbit的問(wèn)題通常是可以修正的。eofbit是在遇到文件結(jié)束符是設(shè)置的,此時(shí)同時(shí)還設(shè)置了failbit。 輸出緩沖區(qū)管理 clear和setstate操作用于改變條件成員的狀態(tài)。clear將條件重設(shè)為有效狀態(tài)。在流的使用出現(xiàn)了問(wèn)題并做出補(bǔ)救后,如果我們希望把流重設(shè)為有效狀態(tài),則可以調(diào)用clear。使用setstate可以打開(kāi)某個(gè)指定的條件,用于表示某個(gè)問(wèn)題的發(fā)生。除了添加的標(biāo)記狀態(tài),setstate將保留其他已存在的狀態(tài)變量不變。 輸出緩沖區(qū)管理: 每個(gè)IO對(duì)象管理一個(gè)緩沖區(qū),用于存儲(chǔ)程序讀寫(xiě)的數(shù)據(jù).下面幾種情況將導(dǎo)致緩沖區(qū)的內(nèi)容被刷新,即寫(xiě)入真實(shí)的輸出設(shè)備或者文件: (1)
程序正常結(jié)束. (2)
在一些不確定的時(shí)候,緩沖區(qū)可能已經(jīng)滿(mǎn)了,在這種情況下,緩沖區(qū)將會(huì)在寫(xiě)入下一個(gè)之值前刷新. (3)
用操作符顯示地刷新緩沖區(qū),例如行結(jié)束符endl. (4)
可將輸出流與輸入流關(guān)聯(lián)起來(lái).在這種情況下,在讀輸入流時(shí)竟刷新其關(guān)聯(lián)的輸出緩沖區(qū). 1.
輸出緩沖區(qū)的刷新 3個(gè)操作符: endl:用于輸出一個(gè)換行符并刷新緩沖區(qū)。 flush:刷新流,但不在輸出中添加任何字符. ends:在緩沖區(qū)中插入空字符null,然后刷新它。 2.
unitbuf操作符 如果需要刷新所有輸出,最好使用unitbuf操作符。這個(gè)操作符在每次執(zhí)行完寫(xiě)操作后都刷新流: cout<<unitbuf<<”first”<<”second”<<nounitbuf; 等價(jià)于: cout<<”first” <<flush<<”second”<<flush; nounitbuf操作符將流恢復(fù)為使用正常的,由系統(tǒng)管理的緩沖區(qū)刷新方式。 3.
將輸入和輸出綁在一起 當(dāng)輸入流與輸出流綁在一起時(shí),任何讀輸入流的嘗試都將首先刷新其輸出流關(guān)聯(lián)的緩沖區(qū)。標(biāo)準(zhǔn)庫(kù)將cout與cin綁在一起。
|
|
來(lái)自: Knowledge Sou... > 《cplusplus》