C++ 輸入與輸出流(cin與cout)

2020-08-11 19:53:04

認識C++ 一個完整C++程式應包含哪些要素
IDE – Integrated Developed Environment 整合開發環境
在这里插入图片描述
一個函數定義 包括四部分
返回型別(return type)
函數名( function name)
一個括號包圍的形參列表(parameter list,允許爲空)
以及函數體(function body)


初識輸入輸出

C++並未定義任何輸入輸出(io)語句
C++以包含全面的標準庫來提供IO機制 機製
關於iosteam庫 包含兩個基礎型別 istreamostream 分別表示輸入流和輸出流

什麼是流
一個流就是一個字元序列 是從從 IO 裝置讀出或寫入IO裝置的 流(stream)想表達的是 隨着時間的推移 字元是順序生成或消耗的

標準輸入輸出物件
標準庫定義了四個IO物件

  1. 處理輸入 – 名爲cin的istream型別物件 這個物件被稱爲標準輸入
  2. 處理輸出 – 名爲cout的ostream型別物件 此物件稱爲標準輸出
  3. 處理警告和錯誤資訊 --名爲cerr的ostream型別物件 此物件稱爲標準錯誤
  4. 處理一般性資訊 --名爲clog的ostream型別物件

案例一 利用標準輸入cin和標準輸出cout進行兩個整型變數之間的加法運算

#include <iostream>//定義了ostream類  不能加上 .h
//通常情況下 #include必須出現在所有函數之外 一般將此指令放在原始檔開始位置

using namespace std;//標準名稱空間  標準庫定義的所有名字都在名稱空間std中

int main()
{
	cout << "請輸入兩個參數" << endl;//表達式中的<<爲輸出運算子 在標準輸出上列印訊息
	//<<輸出運算子接收兩個運算物件 左側必須是一個ostream物件 右側物件爲需要列印的值 將給定的值寫道給定的ostream物件中
	//輸出語句使用兩次<<運算子時 第一個運算子的結果就成了第二個運算子的左側運算物件 就可以將輸出請求連線
	//因此 此表達式等價於	(cout << "請輸入兩個參數" )<< endl;

	//第一個運算子<<給使用者列印一個字串面值常數訊息 是用一對雙引號包圍的字元序列 雙引號之間的文字被列印到標準輸出

	//第二個運算子<<列印endl 是一個被稱爲操縱符的特殊值 效果是結束當前行
	int v1 = 0, v2 = 0;

	cin >> v1 >> v2;
	//輸入運算子>>接收一個istream輸入流作爲其左側運算物件 接受一個物件作爲右側運算物件
	//從給定的istream讀入數據 並存入給定物件中 返回其左側運算物件作爲計算結果 
	//因此 此表達式等價於	(cin >> v1 )>> v2;
    
	cout << "參數" << v1 << "和參數" << v2 << "的和爲" << v1 + v2 << endl;
	return 0;
}

在这里插入图片描述

iostream 標頭檔案
該檔案定義了 cin、cout、cerr 和 clog 物件,分別對應於標準輸入流、標準輸出流、非緩衝標準錯誤流和緩衝標準錯誤流
在这里插入图片描述

標準輸出流(cout)

<< 輸出運算子(流插入運算子) 在標準輸出上列印訊息
1.<<輸出運算子接收兩個運算物件 左側必須是一個ostream物件 右側物件爲需要列印的值 將給定的值寫到給定的ostream物件中
2.輸出語句使用兩次<<運算子時 第一個運算子的結果就成了第二個運算子的左側運算物件 就可以將輸出請求連線

endl 是一個被稱爲操縱符的特殊值 效果是結束當前行

標準輸入流(cin)

預定義的物件 cin 是 iostream 類的一個範例。cin 物件附屬到標準輸入裝置,通常是鍵盤 cin 是與流提取運算子 >> 結合使用的

>>輸入運算子 接收一個istream輸入流作爲其左側運算物件 接受一個物件作爲右側運算物件
從給定的istream讀入數據 並存入給定物件中 返回其左側運算物件作爲計算結果

如果要求輸入多個數據,可以使用如下語句

cin >> one>> two;

這相當於下面 下麪兩個語句

cin >> name;
cin >> age;

標準錯誤流(cerr)

預定義的物件 cerr 是 iostream 類的一個範例。cerr 物件附屬到標準錯誤裝置,通常也是顯示屏,但是 cerr 物件是非緩衝的,且每個流插入到 cerr 都會立即輸出

cerr 也是與流插入運算子 << 結合使用的

標準日誌流(clog)

預定義的物件 clog 是 iostream 類的一個範例。clog 物件附屬到標準錯誤裝置,通常也是顯示屏,但是 clog 物件是緩衝的 這意味着每個流插入到 clog 都會先儲存在緩衝區,直到緩衝填滿或者緩衝區重新整理時纔會輸出

我們暫時無法區分 cout、cerr 和 clog 的差異,但在編寫和執行大型程式時,它們之間的差異就變得非常明顯。所以良好的程式設計實踐告訴我們,使用 cerr 流來顯示錯誤訊息,而其他的日誌訊息則使用 clog 流來輸出

案例二 讀取數量不定的輸入數據

在这里插入图片描述
在这里插入图片描述
:使用cin輸入數據時 windows系統下預設 輸入結束條件爲:遇到Enter、Space、Tab鍵
在從鍵盤向程式輸入數據時 對於如何指出檔案結束 window系統中 輸入檔案結束符的方法是鍵入 Ctrl+Z 然後按下回車鍵

C++標準輸入流(cin)中的方法

在这里插入图片描述

cin.ignore() 與 cin.getline

cin.ignore()函數中有兩個參數,分別爲數值型的a字元型的 ch ,即cin.ignore( a, ch )
cin.getline()函數中有三個參數 分別爲 陣列名 長度 結束符 大體與 cin.get(陣列名,長度,結束符)類似。(實際能讀取長度(-1)個字元,因爲字串結尾是0

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

由此可見
cin.ignore():第一個參數 規定了從流中忽略的數據的個數 在此數目之前的參數(包括回車)都將從流中清除出去
cin.getline(): 第一個參數 指定陣列名 第二個參數爲失效位 大於此失效位的輸入被阻斷(此函數會一次讀取多個字元(包括空白字元)也就是說 如果cin.getline未設定失效位 將返回 帶有空白字元的參數 而cin是空白字元爲結束輸入符的 所以cin.getline的另一功能爲 顯示帶有空白字元的參數)


cin.peek()cin.get()

cin.peek() 返回緩衝區中的下一個字元,但只是檢視,並不從緩衝區中取出

cin.get三個參數 分別是 陣列名 長度 結束符
其中結束符爲可選參數,讀入的字元個數最多爲長度減1個,結束符規定結束字串讀取的字元,預設爲ENTER
在这里插入图片描述
在这里插入图片描述
程式遇到字元A停止,A仍停留在輸入流中。可見,使用peek的效果相當於先用get()讀取一個字元,再用putback()將字元放入輸入流中

cin.get() 不會丟失任何空白符號

cin.get()當輸入的字串超長時,不會引起cin函數的錯誤,後面的cin操作會繼續執行,只是直接從緩衝區中取數據。但是cin.getline()當輸入超長時,會引起cin函數的錯誤,後面的cin操作將不再執行


cin.gcount() 和 **cin.read()**和
cin.gcount() 輸出 輸入流快取區cin中的單位數據的數目
**cin.read 兩個參數 陣列名 長度 **從字串流中讀取n個字元到c陣列中
**cout.write 兩個參數 陣列名 長度 **輸出n個字元到字串輸出流中
在这里插入图片描述
在这里插入图片描述

注意

1.使用cin,從流中讀出的字元,流中就沒有這字元了,再次讀取時只能讀取流中剩下的
2.緩衝區只有在遇到EOF、手動敲回車、流(快取區)滿時,纔將流中的字元全部讀出(即清空快取區)
注:EOF是一個計算機術語,爲End Of File的縮寫,在操作系統中表示資料源無更多的資料可讀取
通常在文字的最後存在此字元表示資料結束