IO基础

  C++中经常使用cout和cin做输入输出,这实际上就是一种流的状态。正如生活中的流水一样,总是单维度、单方向的,从一个地方流向另外一个地方。C++中的iostream就是这种概念,从一个地方流入信息,然后以字节流的方式流向另一个地方。

  传统的C语言中有printf,scanf,getch,gets等函数,他们自身具有一些缺点:1、不可编程,仅仅能识别固有的数据类型,不能输入输出自定义类型;2、代码的可移植性差。

  C++中的I/O流istream和ostream等,可以编程,对于类库的设计者来说很有用;其次可以简化编程,能使得I/O的风格一致。

iostream在c语言中用什么代替_ios

IO缓冲区

iostream在c语言中用什么代替_缓存_02

  计算机的发展过程中,我们一直想做一件事情:能够实现一种跨平台的方式,让我们的硬件能够通过一定的标准连接到软件上。在计算机系统中,不管多复杂的设备,我们都以一种文件系统的方式进行交互。这种思想起源于Linux系统。上图就是这种方式,IO流的信息从设备当中读取出来,经过缓存区进入程序;程序想要输入信息给设备,就是反过来的流程。这中间缓存区的意义在于:可以让信息读起来更加的高效。

标准IO提供的三种类型的缓存模式:

  1. 按块缓存,如文件系统
  2. 按行缓存:\n
  3. 不缓存
//按行缓存
#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;
}

iostream在c语言中用什么代替_iostream在c语言中用什么代替_03


  代码中我们一行输入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;
}