流類庫與輸入輸出

IO流

輸入輸出(IO)是指計算機同任何外部設備之間的數據傳遞。數據可以按“記錄”(或稱“數據塊”)的方式傳遞,也可以按“流”的方式

傳遞。

什麼是記錄?記錄是指有着內部結構的數據塊,記錄內部除了有需要處理的實際數據之外,還可能包含附加信息,這些附加信息

通常是對本記錄數據的描述。

什麼是流? “流”是一種抽象概念,它代表了數據的“無結構化”傳遞。按流的方式進行輸入輸出,數據被當成無結構的字節序列或

字符序列。用來進行輸入輸出操作的流就是IO流,IO流就是以流的方式進行輸入輸出。

數據的表示分爲兩種:內部表示和外部表示。

數據的內部表示便於程序進行數據處理。典型的內部表示有:整型數的二進制表示、浮點數的IEEE表示、字符的ASCII和

Unicode編碼表示。

數據的外部表示則根據不同外部設備的需要有具體不同的表現形式。如果外部數據表示是可讀的字符序列,則稱爲文本I/O,否則

爲二進制I/O。C++標準IO流的主要目的是支持文本I/O,不直接支持二進制I/O。

在I/O流裏,輸入輸出包括4步:格式化/解析、緩衝、編碼轉換、傳遞。

格式化/解析:在內部數據表示(以字節爲單位)與外部數據表示(以字符爲單位)之間進行雙向轉換。

緩衝:用於在格式化/解析與傳遞之間緩存字符序列。

編碼轉換:將一種字符表達式轉換成另一種字符表達式。

傳遞:只要是與外部設備進行通信。

不帶緩衝的輸入

I/O流類庫的輸入輸出操作默認是帶緩衝的。但是,在某些情況下,我們希望輸入不帶緩衝,也就是不等用戶輸入回車鍵,就

把字符輸出。使用庫函數 getch()和getche(),可以實現不帶緩衝的輸入。因爲不帶緩衝,所以也來不及對輸入進行任何格式化

的操作,所以不帶緩衝的輸入總是針對單個字符進行的。

getch():實現不帶緩衝不回顯的輸入

getche():實現不帶緩衝但是回顯的輸入

怎麼讓輸出也是不帶緩衝的呢?

可以使用flush算子和endl算子。flush只是強制清空輸出緩衝區,並不附加一個換行;endl不但清空輸出緩衝區,同時還附加一

個換行符。

一個不帶緩衝輸入輸出的例子:

#include <iostream>
#include <string>
#include <conio.h>
using namespace std;

int main()
{
	char c[6];
	cout<<"please input password:";
	for(int i = 0; i < 5; i++)
	{
		c[i] = getch();		//實現不帶緩衝不回顯的輸入
		//c[i] = getche();	//實現不帶緩衝但是回顯的輸入
		cout<<'*';
	}
	cout<<endl;
	c[5] = '\0';
	if(string(c) == "ilove")
		cout<<flush<<"password is right\n";
	else 
		cout<<"password is wrong"<<endl;
	return 0;
}


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章