C++ 文件结束符
2015-08-11 21:40
197 查看
问题描述:windows下
intmain() { stringstr; while(cin>>str); cout<<"\n"<<"end"<<endl; }
控制台输入多个字符串后,输入文件结束符crtl-Z,并未使while循环结束,该如何跳出while循环?
解决方法:
方法1:回车-ctrl-z-回车
方法2:改代码,设置自己的文件结束符
Stringa;
while((cin>>a)&&a!='X')
X可以为自己设置的文件结束符。
原因解析:
当从键盘输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin.get()就会检测输入缓冲区中是否有了可读的数据。cin.get()还会对键盘上是否有流结束标识的Ctrl-z或者ctrl-d键按下做出检查,其检查的方式有两种,阻塞式以及非阻塞式。
windows系统一般采用阻塞式检查ctrl-z,Unix/Linux系统下一般采用非阻塞式的检查ctrl-d.
阻塞式检查方式是指只有在回车键按下之后才对此前是否有ctrl-z组合键按下进行检查。另外,如果输入缓冲区中有可读的数据则不会检测ctrl-z,因为有可读数据,说明还未到流的末尾。需要注意的时,ctrl-z产生的不是一个普通的ascii字符,因此ctrl-z不会跟其他从键盘输入的字符一样能够存放在输入缓冲区中。因此,若使ctrl-z产生作用,输入ctrl-z之前不应输入任何字符,即输入回车键把之前输入的字符全部送入缓冲区中后,紧接着应输入ctrl-z,然后输入回车键,告知系统检测流结束符ctrl-z.
非阻塞式是指按下ctrl-d之后立即响应的方式。如果在ctrl-d输入之前已经从键盘输入了字符,则ctrl-d相当于回车,即把这些字符送到了输入缓冲区供读取使用,此时ctrl+d不在起流结束符的作用。若ctrl-d输入值钱没有任何键盘输入,则ctrl-d就是流结束的信号。
windows下ctrl-z使用举例说明如下:
从键盘上输入abcd^z再输入回车键后,系统处理如下:因为回车的作用,前面的abcd等字符被送到输入缓冲区中,而^z不会产生自负,因此不会存储到缓冲区中。这是,cin.get()检测到输入缓冲区中已经有数据存在,就不会检测有无^z存在,cin.get()从缓冲中读取相应的数据,如果读取完了,则输入缓冲区重新边为空,cin.get()等待新的输入,可见尽管有ctrl-z输入,但是之前有其他字符,系统并未监测到流结束符。
因此输入流结束符的条件就是:^z之前不能有任何字符输入(回车键除外),然后再用回车键通知系统做流结束符检测。
相关文章推荐
- 【C语言】32位,64位机器sizeof区别
- 关于C语言中的字符指针和字符数组
- C语言第二天
- 我的核弹C++(二)i++与++i
- C++的重载,覆盖,隐藏
- C语言基础01
- C++成长之路
- Python学习笔记2——与C++和JAVA的区别
- C语言如何接收通过键盘输入的任意长度字符串
- 浅谈C++中类的const成员变量,static成员变量和const static成员变量的区别
- C语言将一个字节逆序
- C++中的switch语句的break问题
- 关于C语言中的字符数组和字符指针
- 团体队列
- C++实现堆排序
- C++简单单例模式
- C++/STL用erase删除元素(vector,deque),(list,set,map)
- 10-2. 删除字符串中的子串(20)
- c++类实现字符串的基本函数
- extern "C" 的用法解析