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