I/O
輸出流:ostream
輸入流:istream
輸入輸出流:iostream
iostream
中定義了輸入流對象cin
與輸出流對象cout
。
cin
是一個istream
類的對象,它從標準輸入設備(鍵盤)獲取數據,程序中的變量通過流提取運算符>>
從流中提取數據。流提取符“>>”從流中提取數據時通常跳過輸人流中的空格、tab鍵、換行符等空白字符。注意:只有在輸入完數據再按回車鍵後,該行數據才被送入鍵盤緩衝區,形成輸入流,提取運算符>>
才能從中提取數據。
cout
是一個ostream
類的對象,它通過流插入運算符<<
向輸出設備(屏幕)輸出其後的變量。程序中的變量藉由cout
對象並通過流插入運算符<<
向輸出設備輸出。
在定義流對象時,系統會在內存中開闢一段緩衝區,用來暫存輸入輸出流的數據。
cin>>
/*cin>>T
接受一個字符串,遇空格tab換行結束,返回cin對象。
>>(流提取符)用於從cin輸入流中提取指定類型數據賦值給T
*/
若緩衝區中第一個字符是空格、tab或換行這些分隔符時,cin>>會將其忽略並清除,繼續讀取下一個字符。
若緩衝區爲空,則繼續等待。
分隔符殘留在緩衝區。
get()與cin.get()
int cin.get();//接受一個字符(包括空格tab換行)並返回該字符的asc碼值
istream& cin.get(char& var);//接受一個字符(包括空格tab換行)
istream& get(char* s, streamsize n);//以指定長度讀取字符串(讀取到n-1個字符),遇換行符結束讀取
istream& get(char* s, streamsize n, char delim);////以指定長度讀取字符串,遇指定的字符delim結束讀取
//還有兩種get的重載形式,但暫時不用
//使用第三、四種get,注意結束符需要用第一或第二中get清除緩衝區的結束符,否則會出錯
結束符殘留在緩衝區。
cin.getline()
//從標準輸入設備鍵盤讀取一串指定長度的字符串,並以指定的結束符結束。
istream& getline(char* s, streamsize count);
istream& getline(char* s, streamsize count, char delim);
與cin.get()區別:
- 結束符不會殘留在緩衝區。
- cin.get(char*,int)當輸入的字符串超長時,不會引起cin函數的錯誤,後面的cin操作會繼續執行,只是直接從緩衝區中取數據。但是cin.getline(char*,int)當輸入超長時,會引起cin函數的錯誤,後面的cin操作將不再執行。
getline()
C++中定義了一個在std名字空間的全局函數getline,因爲這個getline函數的參數使用了string字符串,所以聲明在了< string>頭文件中了。
//從輸入流is中讀取一行到字符串str中,當遇到如下三種情況會結束讀操作:1)到文件結束,2)遇到結束符,3)輸入達到最大限度。
istream& getline(istream& is, string& str);
istream& getline(istream& is, string& str, char delim);
注意,getline遇到結束符時,結束符不會殘留在緩存中。因此,進行從鍵盤讀取一行字符時,建議使用getline,較爲安全。
注:如果輸入流是文件輸入流(即讀取文件),則就變爲讀取文件了。
gets()
gets是C中的庫函數,在< stdio.h>申明,從標準輸入設備讀字符串,可以無限讀取,不會判斷上限,以回車結束或者EOF時停止讀取,所以程序員應該確保buffer的空間足夠大,以便在執行讀操作時不發生溢出。
//函數原型:char *gets( char *buffer );
cin.good()與cin.fail()用於判斷cin輸入的類型是否符合要求
int a;
cin >> a;
if (!cin.good())
//輸入類型錯誤
//do something...
另,
// <<與>>的重載實例
#include <iostream>
using namespace std;
class Complex {
public:
friend ostream& operator << (ostream&,Complex&); //聲明重載運算符“<<”
friend istream& operator >> (istream&,Complex&); //聲明重載運算符“>>”
private:
double real;
double imag;
};
ostream& operator << (ostream& output,Complex& c) {//定義重載運算符“<<”
output<<"("<<c.real<<"+"<<c.imag<<"i)";
return output;
}
istream& operator >> (istream& input,Complex& c) {//定義重載運算符“>>”
cout<<"input real part and imaginary part of complex number:";
input>>c.real>>c.imag;
return input;
}