流类库与输入输出

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


 

 

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