關於istream輸入流對象cin的輸入函數

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章