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