概述
無格式輸入輸出是指按系統預定義的格式進行輸入輸出。按默認約定,每個c++程式都能使用標準I/0流,如標準輸入、標準輸出。cin用來處理標準輸入,即鍵盤輸入;cout用來處理標準輸出,即螢幕輸出。它們被定義在iostream頭檔案中。
流在使用之前要被建立,使用後要被刪除,還要使用一些特定的操作從流中獲取數據或向流中添加數據,如插入操作和提取操作。重載這兩種運算符是為了接收指定類型的數據。
(1)無格式輸出
cout是ostream流類的對象,它在iostream頭檔案中作為全局對象定義:
ostream cout(stdout):
在ostream流類中,對應每個基本數據類型定義運算符 重載函式為友元,它們在ostream中聲明:
ostream& operator<<(ostream&dest,char pSource);
ostream&operator<<(ostream&dest,int source);
ostream&operator<<(ostream&dest,char source);
…
例如:
cout<<〝Please enter the data:〞;
右邊的數據是字元串char ,故匹配上面的“ostream&operator<<(ostream&dest,char pSource);”運算符重載函式。cout跟螢幕聯繫,實際就是向螢幕插入數據也就是顯示輸出數據。它將整個字元串輸出,並返回ostream流對象的引用。
(2)無格式輸入
cin是istream流類的對象,它在iostream頭檔案中作為全局對象定義:
istream cin(stdin);
其中,stdin表示標準輸入設備名(鍵盤)。
在istream流類中,對應每個基本數據類型定義運算符 重載函式為友元,它們在ostream中聲明:
istream&operator>>(istream&sour,char pDes);
istream&operator>>(istream&sour,int source);
istream&operator>>(istream&sour,char source);
…
例如:
int x;cin<<x;
此處讀到整數變數x中,故匹配“istream&operator>>(istream&sour,int des);”。cin與鍵盤聯繫,實際就是從鍵盤提取數據也就是等待接收鍵盤的輸入數據。
對於無格式輸入輸出,數據的內部存儲格式與外部存儲格式完全相同。無格式輸入輸出很多情況下是針對二進制檔案的,輸人輸出需要用read函式或write函式,因而要求檔案是按ios-base::binary模式打開的。注意>>和<<不能用於按ios-base::binary打開的檔案(二進制檔案)的輸入和輸出。
成員函式
無格式輸入
無格式輸入對輸入的數據不做任何轉換,輸入流對象中有關的成員函式主要有:
(1)int_type get( );
返回提取的當前輸入位置的字元(可以是空白字元)代碼,若已到流尾而無字元可輸入,返回EOF(即一1)。
(2)istream_type≥t(char_type&c);
提取當前輸入位置的字元(空白字元也可)存入c中,若已到流尾而無字元可輸入,存入c中的是‘\0’。函式返回對流對象本身的引用。
(3)istream_type≥tline(char_type s,streamsize n,char_type delim);
從當前輸入位置開始提取字元存入s所指向的具有n個位元組的字元空間中。字元的提取與存儲在遇到下列情況時停止:
①已提取並存儲了n-1個字元;
②到流尾,無字元可提取;
③下一個要提取的字元等於結柬標誌字元delim。
最後,在已輸入字元序列的後面存入字元串結束符’\0’。函式返回對流對象本身的引用
(4)istream_type≥tline(char_type s,streamsize n);
此函式調用getline(s,n,widen(’\n’)),即以換行符為結束標誌輸入字元序列,即輸入一行字元(回車換行前的所有字元序列)。函式返回對流對象本身的引用。
(5)istream_type&ignore(streamsize n=1,int_type delim=traits::eof());
提取並捨棄(即不存儲)從當前輸入位置的若干字元,因而只起到後移輸入位置的作用。字元提取與捨棄在遇到下列情況時停止:
①已提取了n個字元;
②到流尾,無字元可提取;
③下一個要提取的字元等於結束標誌字元delim。
函式返回對流對象本身的引用。
(6)int_type peek();
返回當前位置上的字元,但輸入位置不動,因此下一次輸入字元時,得到的還是同一字元。若已到流尾而無字元可輸入,返回EOF(即一1);對於cin,所謂流尾就是鍵入的^Z。
(7)istream_type&putback(char_type c);
把字元c退回到輸入流中。使得該字元成為下一個輸入字元。例如,下面這個函式輸入標識符到s中:
void getid (char s)
|
char c=0;
cin>>c; /輸入第一個非空白字元(前導空格等被忽略)
if(isalpha(c) Il C==‘-’)
do{
s + + = c;
c=0;
cin.get(c); //輸入下一個字元,有可能是空格
}while(isalnum(c)IlC==’-’);
s=0
if(c)cin.putback(c);
|
(8)istream_type&read(char_types,streamsize n);
從當前輸入位置開始提取字元存入s所指向的具有n個位元組的字元空間中。字元的提取與存儲在遇到下列情況時停止:
①已提取並存儲了n個字元。
②到流尾,無字元可提取。
函式返回對流對象本身的引用。此函式要求流對象按模式ios_base::binary打開。
無格式輸出
無格式輸出對輸出的數據不做任何轉換,輸出流對象中的有關成員函式主要有:
(1)ostream_type&put(char c);
輸出字元c。函式返回對流對象本身的引用。
(2)ostream_type≀ite(const char*S,streamsize n);
輸出s所指向的數據空間中的n個字元。函式返回對流對象本身的引用。此函式要求流對象按模式ios_base::binary打開。
有格式輸入輸出
為了滿足用戶對數據輸入/輸出的格式控制的要求,C++的輸入/輸出流庫提供了可供用戶修改的某些格式,每種流的格式化信息由一系列的狀態字組成。C++中提供了以下兩種進行格式控制的方法:
①一種是使用ios類的成員函式進行輸入/輸出格式控制。
②另一種是使用ios類的操作符進行輸入/輸出格式控制。
針對檔案的格式化輸入輸出與針對標準設備cin和tout的輸入輸出十分相似,但仍有兩點需要注意。
第一,作為格式化輸入輸出,所操作的檔案都是純文本檔案,因此可以用記事本或寫字板等文本編輯器來準備這樣的數據檔案,以供應用程式輸入處理;應用程式通過格式化輸出所生成的數據檔案也同樣可以用記事本或寫字板等文本編輯器來查看。
第二,每一個作為格式化輸入源的流對象(如cin或一個輸入檔案流)都有一個流結束標記,讀到該標記即表明其後沒有更多的數據了。可以用流的成員函式eof()來判斷是否讀到流結束標記。對於輸入流對象cin,可以通過在鍵盤上打入^Z來插入流結束標記,但在完成輸入後,必須執行一次cin.clear( );後,cin才能繼續使用。