IO基础
C++中经常使用cout和cin做输入输出,这实际上就是一种流的状态。正如生活中的流水一样,总是单维度、单方向的,从一个地方流向另外一个地方。C++中的iostream就是这种概念,从一个地方流入信息,然后以字节流的方式流向另一个地方。
传统的C语言中有printf,scanf,getch,gets等函数,他们自身具有一些缺点:1、不可编程,仅仅能识别固有的数据类型,不能输入输出自定义类型;2、代码的可移植性差。
C++中的I/O流istream和ostream等,可以编程,对于类库的设计者来说很有用;其次可以简化编程,能使得I/O的风格一致。
IO缓冲区
计算机的发展过程中,我们一直想做一件事情:能够实现一种跨平台的方式,让我们的硬件能够通过一定的标准连接到软件上。在计算机系统中,不管多复杂的设备,我们都以一种文件系统的方式进行交互。这种思想起源于Linux系统。上图就是这种方式,IO流的信息从设备当中读取出来,经过缓存区进入程序;程序想要输入信息给设备,就是反过来的流程。这中间缓存区的意义在于:可以让信息读起来更加的高效。
标准IO提供的三种类型的缓存模式:
- 按块缓存,如文件系统
- 按行缓存:\n
- 不缓存
//按行缓存
#include<iostream>
using namespace std;
int main()
{
int a;
int index = 0;
while(cin>>a)
{
cout<<"The number is "<<a<<endl;
index++;
if(index == 5)
break;
}
char ch;
cin >> ch;
cout<<"the last char is "<<ch<<endl;
return 0;
}
代码中我们一行输入6个数字,从代码逻辑上看,while循环一旦到达5就该停止输出了,但是实际上6却被当成ch的值一并输出出来了,而ch的值我们并没有输入。
这就是按行缓存的例子,系统给我们一个区域存储键盘输入的数据,直到见到回车\n,之前的数据全部被记录入缓存而不传递给程序。我们输入的6就变成了一种脏数据。
//清空脏数据
#include<iostream>
using namespace std;
int main()
{
int a;
int index = 0;
while(cin>>a)
{
cout<<"The number is "<<a<<endl;
index++;
if(index == 5)
break;
}
cin.ignore(1024,'\n');
//这是清空缓冲区脏数据的函数,第一个参数指明要清空多少,第二个参数是指明以什么符号作为结尾
//这个值尽可能的增大,1024可以使用numeric_limits<std::streamsize>::max()来代替,表示缓冲区的最大范围
char ch;
cin >> ch;
cout<<"the last char is "<<ch<<endl;
return 0;
}