文章目录
1、一个关于
while(cin)
和
while(getline
)的误区
while(cin)
while(getline
int value; while (std::cin >> value) { std::cout << value << std::endl; } std::string line; while (getline(std::cin, line)) { std::cout << line << std::endl; }
一开始,我对这两个循环语句的理解不够准确,理解很浅显。认为就是一直读取数据,读取正确就执行,读取不正确就停止读取!
但是,会发现陷入了死循环!
对于
while
语句,很清楚,就是条件为真则执行循环体,否则进行下一步。但是关键什么时候为真,什么时候为假呢,其实并不是我想的那样简单,到底什么时候读取正确,什么时候读取错误呢?请继续往下看!
2、一个
istream
对象可以作为条件
当我们使用一个
istream
对象作为条件时,其效果是检测流的状态。
- 如果流是有效的,即未遇到错误,则检测成功。
- 当遇到
文件结束符
(end-of-file),或遇到一个无效输入时(需要读入int,确遇到了非int),stream对象状态会变成无效。处于无效状态的istream对象会使条件为假。
3、从键盘输入文件结束符
当从键盘向程序输入数据时,对于如何指出文件结束,不同的操作系统有不同的约定
windows系统中,输入文件结束符的方法是敲
ctrl + z
unix系统中,包括max os系统,文件结束符敲
ctrl + d
Mac 下的Clion编译器,需要在调试窗口才有效,如果是运行窗口,按
ctr+d
就直接退出程序了
4、while(cin)
std::cin >> value
返回其左侧运算对象,即一个stream对象所以
std::cin >> value
可以作为
while
的循环条件//读取未知数量的整数 int value; while (std::cin >> value) { std::cout << value << std::endl; } //读取未知数量的字符串 std::string world; while (std::cin >> world) { std::cout << world << std::endl; }
5、while(getline)
getline()
的原型istream& getline ( istream &is , string &str , char delim );
其中
istream &is
表示一个输入流,譬如
cin
;
string&str
表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以);
char delim
表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为
'\n'
,也就是回车换行符(遇到回车停止读入)很容易看出
getline
的返回值是一个
istream
对象,因此也可以作为while条件//读取未知数量的字符串行 std::string line; while (getline(std::cin, line)) { std::cout << line << std::endl; }
6、何时使用
while(cin)
和
while(getline)
while(cin)
while(getline)
当我们知道需要读取的数据个数时,我们可以通过
for语句或while语句控制读取次数
。但是当我们不知道需要读取多少数据,或者说
读取未知数量的数据时,就需要将istream对象作为条件
。