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