(一)C++的輸入和輸出概論
C語言采用stdio.h頭文件來定義標準輸入輸出方法秤掌,這在c++中同樣適用,只不過頭文件變?yōu)榱?lt;cstdio>静尼。而c++中更常見的類是由頭文件<iostream>,<fstream>定義的輸入輸出流類庫和文件輸入輸出流類庫瑰排。
1.流和緩沖區(qū)
c++程序?qū)⑤斎牒洼敵隹闯墒亲止?jié)流昔穴,流是由一個個字節(jié)構(gòu)成的,c++程序只檢查字節(jié)流剧蚣,而不考慮字節(jié)流來自何方支竹,去往何處旋廷。因此,c++將輸入輸出與具體的設備分離開礼搁,便于編程饶碘。
輸入輸出流就像一個管道,管道的兩端分別是流內(nèi)字節(jié)的來源和去向馒吴。具體來說扎运,管理輸入包括兩步:一是將輸入流與輸入去向的程序關聯(lián)起來,二是將輸入流的文件端與文件連接起來(這里的文件指的可以是文件饮戳,也可以是設備)豪治。輸出管理同樣如此,一邊是將程序與輸出流的程序端相連扯罐,一邊是將輸出目標與輸出流的文件端連接起來负拟。
通常,使用緩沖區(qū)可以更高效地處理輸入和輸出歹河。清空緩沖區(qū)的動作叫作刷新緩沖區(qū)掩浙,flushing the buffer。對于文件來說是如此启泣,對于鍵盤和屏幕輸入輸出操作也是如此涣脚,對鍵盤輸入設置緩沖,可以讓我們在數(shù)據(jù)流入程序之前能夠更正輸入寥茫,因此通常遣蚀,當我們鍵盤輸入回車之后才會刷新緩沖區(qū),而輸出時輸出回車字符時才刷新屏幕的緩沖區(qū)纱耻。
2.流芭梯,緩沖區(qū)和iostream文件
(1)iostream頭文件中包含了許多能夠管理流和緩沖區(qū)的類,這些類用來創(chuàng)建弄喘,管理和實現(xiàn)流和緩沖區(qū):
streambuf類為緩沖區(qū)提供了內(nèi)存玖喘,并提供了可以填充,訪問蘑志,刷新和管理的方法累奈。
ios_base類表示流的一般特征。
ios類基于ios_base急但,其中包括了一個指向streambuf對象的指針成員澎媒。
ostream類基于ios類,是輸出
istream類基于ios類波桩,是輸入戒努。
iostram類是基于ostream類和istream類的,因此具有輸入輸出方法镐躲。
要使用這些類储玫,必須創(chuàng)建相應的對象侍筛,比如使用ostream對象cout來管理輸出,創(chuàng)建這樣的對象將打開一個流撒穷,自動創(chuàng)建緩沖區(qū)匣椰,并與流關聯(lián)起來,同時這些對象可以使用相應的成員函數(shù)端礼。
istream和ostream都是char具體化的typedef窝爪,而wistream和wostream都是wchar_t的具體化,例如wcout用于輸出寬字符流齐媒。一些輸入輸出中獨立于類型的信息是在ios_base中定義的蒲每,比如ios_base::fixed;
它們的層次結(jié)構(gòu)是streambuf本身是用來實現(xiàn)內(nèi)存和緩沖區(qū)的類,然后ios_base實現(xiàn)了流的一些特性喻括,比如格式等等邀杏,但是不能使用緩沖區(qū),然后ios_base派生出了ios唬血,可以使用緩沖區(qū)望蜡;接著ostream和istream類是可以直接使用的輸出輸入類,但他們都是單向的拷恨;最后脖律,iostream類是多重繼承了這兩個類,可以創(chuàng)建雙向的流腕侄。
(2)在程序中包含iostream將自動創(chuàng)建八個流對象小泉,4個用于寬字符流,4個用于窄字符流冕杠。
cin是標準輸入流微姊,通常被關聯(lián)到標準輸入設備(鍵盤),wcin也是如此分预,但是主要處理wchar_t數(shù)據(jù)類型兢交。
cout是標準輸出流,被關聯(lián)到屏幕笼痹,wcout與此相類似配喳,處理的是wchar_t類型。
cerr和wcerr是標準錯誤流凳干,默認關聯(lián)到屏幕晴裹,這兩個流沒有被緩沖,就是有錯誤直接發(fā)送到屏幕纺座。
clog和wclog也是標準錯誤流息拜,同樣關聯(lián)到屏幕溉潭,但這兩個流是被緩沖的净响。
(3)總之少欺,流的一端與程序相連,另一端與標準輸出相連馋贤,cout對象憑著streambuf對象的幫助赞别,管理著流中的字節(jié)流。
3.重定向
(1)標準輸入輸出通常都連接著鍵盤和屏幕配乓,但很多系統(tǒng)仿滔,如unix和linux,windows都支持重定向犹芹,也就是改變標準輸入輸出的流向崎页。
(2)程序輸出重定向指的是程序,也就是說我們可以指定程序的輸入輸出的另一個端點的連接腰埂,而這一端始終是連接著程序的飒焦。比如count是一個程序,我們通過count < a.txt >b.txt將標準輸入與a.txt連接屿笼,而標準輸出與b.txt連接牺荠,程序與標準輸入輸出的程序端連接,這就是重定向驴一,重定向的是非程序端休雌。
(3)值得一提的是,cout是標準輸出流肝断,上面的重定向是指的cout杈曲,而cerr和clog代表的標準錯誤流并不會重定向,而是依然從屏幕輸出胸懈。有一些程序也會允許對標準錯誤流進行重定向鱼蝉,比如Unix和linux系統(tǒng)采用2>重定向標準錯誤流。