std::cin无限读取的原理

在C语言中,如果遇到需要读取不定数量的数据时,通常使用

1
2
3
while(scanf() != EOF){
//do something...
}

的方式来实现

而在C++中就简单了一些。

C++可以通过std::cin通过流^(1)读取数据,比如以下代码

1
2
3
4
int value,sum;
while(std::cin >> value){
sun += value;
}

这段代码是从流读取一个整数,保存在value中。输入运算符返回左侧运算对象^(2)。也就是说以上代码的循环条件也就是检测std::cin。

使用istream对象^(3)作为运算条件时,是在检测流的状态。如果流有效那么会继续输入,遇到EOF或者无效的输入时istream就会变为无效,运算条件为假,然后结束这个循环。

以上,也就解释了C++循环读取一个不定数量的数据的原理。

1.C++流是指信息从外部输入设备(如键盘和磁盘)向计算机内部(即内存)输入和从内存向外部输出设备(如显示器和磁盘)输出的过程,这种输入输出过程被形象地比喻为”流”。参考C++流的概念

2.输入运算符 >> 与输出运算符 << 接受一个istream作为左侧运算对象,接受一个对象作为右侧运算对象。从给定的istream接受或输出数据,接受的数据会存入给定对象中,输出运算符则是返回左侧运算对象作为其计算结果。

3.标准中定义的std::cin就是istream类型。

script>