C/C++中流的基本概念
在C++語言中,資料的輸入和輸出(簡寫為I/O)包括對標準輸入裝置鍵盤和標準輸出裝置顯示器、對在外存磁碟上的檔案和對記憶體中指定的字串儲存空間(當然可用該空間儲存任何資訊)進行輸入輸出這三個方面。對標準輸入裝置和標準輸出裝置的輸入輸出簡稱為標準I/O,對在外存磁碟上檔案的輸入輸出簡稱為檔案I/O,對記憶體中指定的字串儲存空間的輸入輸出簡稱為串I/O。
C++語言系統為實現資料的輸入和輸出定義了一個龐大的類庫,它包括的類主要有ios,istream,ostream,iostream,ifstream,ofstream,fstream,istrstream,ostrstream,strstream等,其中ios為根基類,其餘都是它的直接或間接派生類。
ios為根基類,它直接派生四個類:輸入流類istream、輸出流類ostream、檔案流基類fstreambase和字串流基類strstreambase,輸入檔案流類同時繼承了輸入流類和檔案流基類(當然對於根基類是間接繼承),輸出檔案流類ofstream同時繼承了輸出流類和檔案流基類,輸入字串流類istrstream同時繼承了輸入流類和字串流基類,輸出字串流類ostrstream同時繼承了輸出流類和字串流基類,輸入輸出流類iostream同時繼承了輸入流類和輸出流類,輸入輸出檔案流類fstream同時繼承了輸入輸出流類和檔案流基類,輸入輸出字串流類strstream同時繼承了輸入輸出流類和字串流基類。
“流”就是“流動”,是物質從一處向另一處流動的過程。C++流是指資訊從外部輸入裝置(如鍵盤和磁碟)向計算機內部(即記憶體)輸入和從記憶體向外部輸出裝置(如顯示器和磁碟)輸出的過程,這種輸入輸出過程C被形象地比喻為“流”。為了實現資訊的內外流動,C++系統定義了I/O類庫,其中的每一個類都稱作相應的流或流類,用以完成某一方面的功能。根據一個流類定義的物件也時常被稱為流。如根據檔案流類fstream定義的一個物件fio,可稱作為fio流或fio檔案流,用它可以同磁碟上一個檔案相聯絡,實現對該檔案的輸入和輸出,fio就等同於與之相聯絡的檔案。
C++系統中的I/O類庫,其所有類被包含在iostream.h,fstream.h和strstrea.h這三個系統標頭檔案中,各標頭檔案包含的類如下:
iostream.h包含有:ios, iostream,istream, ostream, iostream_withassign, istream_withassign, ostream_withassign等。
fstream.h包含有:fstream, ifstream,ofstream和fstreambase,以及iostream.h中的所有類。
Strstrea.h包含有:strstream,istrstream, ostrstream和strstreambase,以及iostream.h中的所有類。
在一個程式或一個編譯單元(即一個程式檔案)中當需要進行標準I/O操作時,則必須包含標頭檔案iostream.h,當需要進行檔案I/O操作時,則必須包含標頭檔案fstream.h,同樣,當需要進行串I/O操作時,則必須包含標頭檔案strstrea.h。在一個程式或編譯單元中包含一個頭檔案的命令格式為“#include<標頭檔案名>”,當然若標頭檔案是使用者建立的,則標頭檔案名的兩側不是使用尖括號,而是使用雙引號。當系統編譯一個C++檔案對#include命令進行處理時,是把該命令中指定的檔案中的全部內容嵌入到該命令的位置,然後再編譯整個C++檔案生成相應的目的碼檔案。
C++不僅定義有現成的I/O類庫供使用者使用,而且還為使用者進行標準I/O操作定義了四個類物件,它們分別是cin,cout,cerr和clog,其中cin為istream_withassign流類的物件,代表標準輸入裝置鍵盤,也稱為cin流或標準輸入流,後三個為ostream_withassign流類的物件,cout代表標準輸出裝置顯示器,也稱為cout流或標準輸出流,cerr和clog含義相同,均代表錯誤資訊輸出裝置顯示器。因此當進行鍵盤輸入時使用cin流,當進行顯示器輸出時使用cout流,當進行錯誤資訊輸出時使用cerr或clog。
在istream輸入流類中定義有對右移操作符>>過載的一組公用成員函式,函式的具體宣告格式為:
istream&operator>>(簡單型別識別符號&);
簡單型別識別符號可以為char, signed char,unsigned char, short, unsigned short, int, unsigned int, long, unsigned long,float, double, long double, char*, signed char*, unsigned char*之中的任何一種,對於每一種型別都對應著一個右移操作符過載函式。由於右移操作符過載用於給變數輸入資料的操作,所以又稱為提取操作符,即從流中提取出資料賦給變數。
當系統執行cin>>x操作時,將根據實參x的型別呼叫相應的提取操作符過載函式,把x引用傳送給對應的形參,接著從鍵盤的輸入中讀入一個值並賦給x(因形參是x的別名)後,返回cin流,以便繼續使用提取操作符為下一個變數輸入資料。
當從鍵盤上輸入資料時,只有當輸入完資料並按下回車鍵後,系統才把該行資料存入到鍵盤緩衝區,供cin流順序讀取給變數。還有,從鍵盤上輸入的每個資料之間必須用空格或回車符分開,因為cin為一個變數讀入資料時是以空格或回車符作為其結束標誌的。
當cin>>x操作中的x為字元指標型別時,則要求從鍵盤的輸入中讀取一個字串,並把它賦值給x所指向的儲存空間中,若x沒有事先指向一個允許寫入資訊的儲存空間,則無法完成輸入操作。另外從鍵盤上輸入的字串,其兩邊不能帶有雙引號定界符,若帶有隻作為雙引號字元看待。對於輸入的字元也是如此,不能帶有單引號定界符。
在ostream輸出流類中定義有對左移操作符<<過載的一組公用成員函式,函式的具體宣告格式為:
ostream&operator<<(簡單型別識別符號);
簡單型別識別符號除了與在istream流類中宣告右移操作符過載函式給出的所有簡單型別識別符號相同以外,還增加一個void* 型別,用於輸出任何指標(但不能是字元指標,因為它將被作為字串處理,即輸出所指向儲存空間中儲存的一個字串)的值。由於左移操作符過載用於向流中輸出表達式的值,所以又稱為插入操作符。如當輸出流是cout時,則就把表示式的值插入到顯示器上,即輸出到顯示器顯示出來。
當系統執行cout<操作時,首先根據X值的型別呼叫相應的插入操作符過載函式,把X的值按值傳送給對應的形參,接著執行函式體,把X的值(亦即形參的值)輸出到顯示器螢幕上,從當前螢幕游標位置起顯示出來,然後返回COUT流,以便繼續使用插入操作符輸出下一個表示式的值。當使用插入操作符向一個流輸出一個值後,再輸出下一個值時將被緊接著放在上一個值的後面,所以為了讓流中前後兩個值分開,可以在輸出一個值之後接著輸出一個空格,或一個換行符,或其他所需要的字元或字串。