1.?輸入/輸出流類層次
C++的輸入/輸出流類庫(kù)是用派生方法建立起的,它有2個(gè)平行的基類,streambuf和ios。其他的流類都是從這兩個(gè)基類直接或間接派生的。
1.1???streambuf
streambuf類是帶有緩沖區(qū)的流類庫(kù),它的作用是提供物理設(shè)備的接口、緩沖區(qū)或處理流的通用方式。當(dāng)其用做流類庫(kù)中的基類時(shí),派生以下三個(gè)流類:
(1)filebuf類:使用文件來(lái)保存緩沖區(qū)中的字符序列;
(2)strstreambuf類:擴(kuò)展streambuf的功能,提供在內(nèi)存進(jìn)行提取和插入操作的緩沖區(qū)管理;
(3)onbuf類:擴(kuò)展類streambuf的功能,用于處理輸出、提供控制光標(biāo)、設(shè)置顏色、定義活動(dòng)窗口、清屏、清一行等功能,為輸出操作提供緩沖區(qū)管理;
該類使用的緩沖區(qū)由一個(gè)字符序列和輸入緩沖區(qū)指針與輸出緩沖區(qū)指針組成,指針指向字符被取出或插入的位置。通常情況下,均使用這三個(gè)派生類,很少直接使用streambuf類。
1.2? ?ios類
ios類及其派生類為用戶提供了使用流類的接口,它們均有一個(gè)指針指向streambuf類。Ios及其派生類使用streambuf來(lái)完成對(duì)錯(cuò)誤的格式化輸入輸出檢查,并且支持對(duì)streambuf的緩沖區(qū)進(jìn)行I/O時(shí)的格式化或非格式化轉(zhuǎn)換。
ios類及其派生類的層次關(guān)系:
ios,istream,ostream和上述提到的帶緩沖區(qū)的流類庫(kù)streambuf類構(gòu)成了C++中iostream輸入/輸出功能的基礎(chǔ)。流是一個(gè)抽象的概念,實(shí)際進(jìn)行IO操作時(shí),必須將流與一種具體的物理設(shè)備聯(lián)系起來(lái)。比如,將流和鍵盤聯(lián)系起來(lái),當(dāng)從該流中提取數(shù)據(jù)時(shí),就是從鍵盤輸入數(shù)據(jù),可以用istream,ostream等類聲明流對(duì)象:
istream is;
ostream os;
2.?標(biāo)準(zhǔn)輸入/輸出流
C++將一些常用的流類對(duì)象,如鍵盤輸入,顯示器輸出,程序運(yùn)行出錯(cuò)輸出,打印機(jī)輸出等,定義并內(nèi)置在系統(tǒng)中,供用戶之間使用。這些系統(tǒng)內(nèi)置的用于設(shè)備間傳遞數(shù)據(jù)的對(duì)象稱為標(biāo)準(zhǔn)流類對(duì)象,共4個(gè)。
(1)cin對(duì)象:與標(biāo)準(zhǔn)輸入設(shè)備相關(guān)聯(lián)的標(biāo)準(zhǔn)輸入流;
(2)cout對(duì)象:與標(biāo)準(zhǔn)輸出設(shè)備相關(guān)聯(lián)的標(biāo)準(zhǔn)輸出流;
(3)cerr對(duì)象:與標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備相關(guān)聯(lián)的非緩沖方式的標(biāo)準(zhǔn)輸出流;
(4)clog對(duì)象:與標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備相關(guān)聯(lián)的緩沖方式的標(biāo)準(zhǔn)輸出流。
例子??輸出char*?類型的變量
C語(yǔ)言中的I/O必須要提供數(shù)據(jù)類型信息。C++對(duì)此做了改進(jìn),能夠自動(dòng)判別數(shù)據(jù)類型,但是有時(shí)還得提供使用類型信息。比如,字符串是char*?類型,假設(shè)需要輸出其指針的值,即字符串中第一個(gè)字符的地址,但是重載運(yùn)算符<
#include
using?namespace?std;
int?main()
{
char?*string =?"test";
cout?<"sting is: "?<
cout?<"
Value of static cast
cout?<(string)?<
system("pause");
return?0;
}
通常在while循環(huán)結(jié)構(gòu)的首部用流讀取運(yùn)算符輸入一系列的值。當(dāng)遇到文件結(jié)束符時(shí),讀取運(yùn)算符返回(false)。
#include
using?namespace?std;
int?main()
{??????
int?grade, highestGrade = -1;
cout?<"Enter grade(enter end-of-file to end):";
while?(cin?>>?grade)
{
if?(grade > highestGrade)
highestGrade = grade;
cout?<"Enter grade (enter end of file to end):";
}
cout?<" Highest grade is:"?<
system("pause");
return?0;
}
在上述程序中,cin>>grade可以作為條件,因?yàn)榛恑os(繼承istream)提供了一個(gè)重載的強(qiáng)制類型轉(zhuǎn)換運(yùn)算符,將流變成void*類型的指針。如果讀取數(shù)值發(fā)生錯(cuò)誤或遇到文件結(jié)束符,則指針值為0。編譯器能夠隱式使用void*類型的強(qiáng)制轉(zhuǎn)換運(yùn)算符。
?
評(píng)論
查看更多