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; }