一.问题起源:
在学习Dijstra算法的时候对一行程序不理解,从而深入思考:
while (scanf("%d%d", &n, &m) != EOF && n)
对这行代码的解释:
疑问:C语言的库<cstdio>中的库函数scanf在读取到输入的文件的终止符EOF后即停止读取;那么C++的库<iostream>中的cin输入流对象也有相似的功能吗?cin是如何读取文件的?cin是如何读取控制台数据的?
a
a
a
a
a
二.含有cin的语句的返回值是什么
注意:
1. 如果cin成功输入了数据,那么这个语句会返回true;
2. 如果cin并未成功输入数据,那么这个语句会返回false;
a
a
a
a
a
三.含有cin的语句何时结束输入
cin既可以通过键盘从控制台输入数据,也可以通过文件输入数据;
(1)情况1:通过文件输入数据很好理解,当cin读取到文件的末尾且再也没有数据可以被读取时,就会读取到EOF符号,这个时候就相当于【cin >> EOF】,这个语句就意味着输入数据失败,因此语句【cin >> EOF】的返回值为False;
(2)情况2:但是通过控制台输入数据的话,输入数据多少是不确定的,而且控制台的输入是没有明确的结束符的(类似于文件末尾的EOF符号),在没有确切结束标志的情况下,该如何判断输入数据已经读完了呢?总不能把控制台关闭吧,这样程序也运行结束了;C++提供了特殊的控制字符来表示输入结束:在 Windows 系统中,通过键盘输入时,按 Ctrl+Z 组合键后再按回车键,就代表输入结束;在 UNIX/Linus/Mac OS 系统中,Ctrl+D 代表输入结束;
总结:cin在读取到结束符(EOF,Ctrl+Z,Ctrl+D 这三个都是结束符)的时候,就代表读取数据失败,读取数据工作终止,返回False
举例:
#include <iostream>
using namespace std;
int main()
{
int x;
while (cin >> x)
{
cout << x << "---------------------" << endl;
}
cout << "已完成输入" << endl;
system("pause");
return 0;
}
输出情况:
解释:敲下【Ctrl+Z+回车】后从while循环中跳出,因为cin读取到了输入是Ctrl+Z,是一个终止符,因此返回了False
a
a
a
a
a