1.?輸入/輸出流類(lèi)層次
C++的輸入/輸出流類(lèi)庫(kù)是用派生方法建立起的,它有2個(gè)平行的基類(lèi),streambuf和ios。其他的流類(lèi)都是從這兩個(gè)基類(lèi)直接或間接派生的。
1.1???streambuf
streambuf類(lèi)是帶有緩沖區(qū)的流類(lèi)庫(kù),它的作用是提供物理設(shè)備的接口、緩沖區(qū)或處理流的通用方式。當(dāng)其用做流類(lèi)庫(kù)中的基類(lèi)時(shí),派生以下三個(gè)流類(lèi):
(1)filebuf類(lèi):使用文件來(lái)保存緩沖區(qū)中的字符序列;
(2)strstreambuf類(lèi):擴(kuò)展streambuf的功能,提供在內(nèi)存進(jìn)行提取和插入操作的緩沖區(qū)管理;
(3)onbuf類(lèi):擴(kuò)展類(lèi)streambuf的功能,用于處理輸出、提供控制光標(biāo)、設(shè)置顏色、定義活動(dòng)窗口、清屏、清一行等功能,為輸出操作提供緩沖區(qū)管理;
該類(lèi)使用的緩沖區(qū)由一個(gè)字符序列和輸入緩沖區(qū)指針與輸出緩沖區(qū)指針組成,指針指向字符被取出或插入的位置。通常情況下,均使用這三個(gè)派生類(lèi),很少直接使用streambuf類(lèi)。
1.2? ?ios類(lèi)
ios類(lèi)及其派生類(lèi)為用戶提供了使用流類(lèi)的接口,它們均有一個(gè)指針指向streambuf類(lèi)。Ios及其派生類(lèi)使用streambuf來(lái)完成對(duì)錯(cuò)誤的格式化輸入輸出檢查,并且支持對(duì)streambuf的緩沖區(qū)進(jìn)行I/O時(shí)的格式化或非格式化轉(zhuǎn)換。
ios類(lèi)及其派生類(lèi)的層次關(guān)系:

ios,istream,ostream和上述提到的帶緩沖區(qū)的流類(lèi)庫(kù)streambuf類(lèi)構(gòu)成了C++中iostream輸入/輸出功能的基礎(chǔ)。流是一個(gè)抽象的概念,實(shí)際進(jìn)行IO操作時(shí),必須將流與一種具體的物理設(shè)備聯(lián)系起來(lái)。比如,將流和鍵盤(pán)聯(lián)系起來(lái),當(dāng)從該流中提取數(shù)據(jù)時(shí),就是從鍵盤(pán)輸入數(shù)據(jù),可以用istream,ostream等類(lèi)聲明流對(duì)象:
istream is;
ostream os;
2.?標(biāo)準(zhǔn)輸入/輸出流
C++將一些常用的流類(lèi)對(duì)象,如鍵盤(pán)輸入,顯示器輸出,程序運(yùn)行出錯(cuò)輸出,打印機(jī)輸出等,定義并內(nèi)置在系統(tǒng)中,供用戶之間使用。這些系統(tǒng)內(nèi)置的用于設(shè)備間傳遞數(shù)據(jù)的對(duì)象稱為標(biāo)準(zhǔn)流類(lèi)對(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*?類(lèi)型的變量
C語(yǔ)言中的I/O必須要提供數(shù)據(jù)類(lèi)型信息。C++對(duì)此做了改進(jìn),能夠自動(dòng)判別數(shù)據(jù)類(lèi)型,但是有時(shí)還得提供使用類(lèi)型信息。比如,字符串是char*?類(lèi)型,假設(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)榛?lèi)ios(繼承istream)提供了一個(gè)重載的強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符,將流變成void*類(lèi)型的指針。如果讀取數(shù)值發(fā)生錯(cuò)誤或遇到文件結(jié)束符,則指針值為0。編譯器能夠隱式使用void*類(lèi)型的強(qiáng)制轉(zhuǎn)換運(yùn)算符。
?
電子發(fā)燒友App
























評(píng)論