C++cin判断输⼊结束(读取结束)
cin 可以⽤来从键盘输⼊数据;将标准输⼊重定向为⽂件后,cin 也可以⽤来从⽂件中读⼊数据。在输⼊数据的多少不确定,且没有结束标志的情况下,该如何判断输⼊数据已经读完了呢?
从⽂件中读取数据很好办,到达⽂件末尾就读取结束了。从控制台读取数据怎么办呢?总不能把控制台关闭吧?这样程序也运⾏结束了!
其实,在控制台中输⼊特殊的控制字符就表⽰输⼊结束了:
在 Windows 系统中,通过键盘输⼊时,按 Ctrl+Z 组合键后再按回车键,就代表输⼊结束。
在 UNIX/Linux/Mac OS 系统中,Ctrl+D 代表输⼊结束。
不管是⽂件末尾,还是 Ctrl+Z 或者 Ctrl+D,它们都是结束标志;cin 在正常读取时返回 true,遇到结束标志时返回 false,我们可以根据 cin 的返回值来判断是否读取结束。
cin 判断控制台(键盘)读取结束
输⼊若⼲个正整数,输出其中的最⼤值,程序该如何编写?
1. #include <iostream>
2. ug namespace std;
3. int main()
4. {
5. int n;
6. int maxN = 0;
7. while (cin >> n){ //输⼊没有结束,cin 就返回 true,条件就为真
8. if (maxN < n)
9. maxN = n;
10. }
11. cout << maxN <<endl;
12. return 0;
13. }
linux怎么读文件内容在 Windows 下运⾏该程序,先输⼊以下整数:
10
30
93
206
8
然后在按下 Ctrl+Z 组合键(可以在当前⾏,也可以在新的⼀⾏),接着按下回车键,输⼊就结束了,此时 cin 返回 false,
循环结束,得到了最⼤值。
完整的输⼊输出结果如下所⽰:
10↙
30↙
93↙
206↙
8↙
^Z↙
206
↙表⽰回车键,^Z表⽰ Ctrl+Z 组合键。
cin 判断⽂件读取结束
如果将标准输⼊重定向为某个⽂件,如在程序开始添
加freopen("", "r", stdin);语句,或者不添加上述语句,但是在Windows 的“命令提⽰符”窗⼝中输⼊:
mycin < //假设编译⽣成的可执⾏⽂件的名字为
则都能使得本程序不再从键盘输⼊数据,⽽是从 ⽂件输⼊数据(前提是 ⽂件和 在同⼀个⽂件夹中)。在这种情况下, ⽂件中并不需要包含 Ctrl+Z,只要有⽤空格或回车隔开的若⼲个正整数即可。
cin 读到⽂件末尾时,cin>>n就会返回 false,从⽽导致程序结束。例如,假定 ⽂件中的内容如下所⽰:
112
23123
34 444 55
44
对于前⾯的代码,在“命令提⽰符”窗⼝中先 cd 到 所在⽬录,然后输⼊mycin < ,则程序的输出是:
23123
下⾯是笔者实操演⽰图:
答疑解惑
在《》⼀节中我们提到过 istream 类将>>重载为成员函数,⽽且
这些成员函数的返回值是 cin 的引⽤。准确地说,cin>>n的返回值的确是 istream & 类型的,⽽ while 语句中的条件表达式的返回值应该是 bool 类型、整数类型或其他和整数类型兼容的类型,istream & 显然和整数类型不兼容,为什么while(cin>>n)还能成⽴呢?
这是因为,istream 类对强制类型转换运算符 bool 进⾏了重载,这使得 cin 对象可以被⾃动转换成 bool 类型。所谓⾃动转换的过程,就是调⽤ cin 的 operator bool() 这个成员函数,⽽该成员函数可以返回某个标志值,该标志值在 cin 没有读到输⼊结尾时为 true,读到输⼊结尾后变为 false。对该标志值的设置,在operator <<() 成员函数中进⾏。
如果 cin 在读取过程中发⽣了错误,cin>>n这样的表达式也会返回 false。例如下⾯的程序:
1. #include <iostream>
2. using namespace std;
3. int main()
4. {
5. int n;
6. while (cin >> n)
7. cout << n << endl;
8. return 0;
9. }
程序本该输⼊整数,如果输⼊了⼀个字母,则程序就会结束。因为,应该读⼊整数时却读⼊了字母也算读⼊出错。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论