标准输入cin的返回值以及读入未知数目数据的问题
来源:互联网 发布:java定时器执行一次 编辑:程序博客网 时间:2024/05/21 11:25
一、标准输入cin的返回值
首先输入操作符“>>”接受一个istream对象作为其左操作数,接受一个对象为其右操作数,读取数据并保存到右操作数中,并返回其左操作数作为结果。以语句std::cin>>value为例,其左操作数为std::cin,右操作数为value,执行这条语句的结果是从标准输入读取一个值,存放在value中,并返回std::cin。
istream的对象cin有四种状态:cin.eof()、cin.bad( )、cin.fail( )、cin.good( )。cin.good( )方法是检测标准输入流的有效状态,如果流有效则返回true;如果cin.eof( )、cin.bad( )、cin.fail( )三者任何一个被设置为true,则cin.good( )为false。
二、读入未知数目的基本类型数据(value为字符型、整型、浮点型等)时循环体的退出问题
while(std::cin >> value)这个语句括号里实际是检测cin.good()方法的返回值,如果cin.good()返回为true,则执行循环体。当cin执行错误,或者标准输入流结束的时候,while条件才不满足。
下面看看退出循环体的情况:
1、当在windows下遇到ctrl+z(unix下为ctrl+d)或者eof时,表示终止输入,此时cin.eof( )的返回值被设置为true,cin.good()返回false,循环体退出。
2、当输入类型与定义的value类型不同时,比如value是int型而输入字符,那么cin在尝试将输入的字符读为int型数据失败,cin.fail( )的返回值被设置为true,cin.good()返回false,循环体退出。
例子:
#include <iostream>
int main()
{
int sum=0,value;
std::cout<<"Enter some numbers :"<<std::endl;
while(std::cin >> value)
sum+=value;
std::cout<<sum<<std::endl;
return0;
}
三种方法结束循环:
1、输入数字,空格隔开,输完后,按Ctrl+Z,回车
2、输入数字,空格隔开,输完后,再输入eof(大小写均可)回车
3、输入数字,空格隔开,输完后,任意输入非数字字符(结束符),回车
三、读入未知数目的string对象(value为string对象)及循环体退出问题
与读写内置类型类似,我们可以用iostream的标准输入输出操作符来读写string对象。不同的是,string类型的输入操作符读取数据时忽略开头所有的空白字符(如空格,换行符,制表符),读取字符直到再次遇到空白字符,读取终止。因此我们可以利用这一点来隔开不同的输入。
例子:
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main(){
string s;
while(cin>>s)
cout<<s<<endl;
return 0;
}
windows下结束循环的方法:回车,ctrl+z,回车。
原因解释如下:
当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车时,cin就会检测输入缓冲区中是否有了可读的数据。cin还会对键盘上是否有作为流结束标志的ctrl+z或者ctrl+d键按下进行检查。检查方式有两种:阻塞式以及非阻塞式。阻塞式检查方式指的是只有在回车键按下后才对之前是否有ctrl+z或者ctrl+d键按下进行检查,非阻塞式是指按下ctrl+z或者ctrl+d键后立即响应。windows系统中一般采用阻塞式检查ctrl+z,unix\linux一般采用非阻塞式检查ctrl+d。
windows系统中这种检查方式还有另外一个特点,就是如果缓冲区中有可读的数据则不会检测ctrl+z,这是因为还有要读的数据,故不能认为到了流的末尾。因此结束的方式为:回车,ctrl+z,回车。第一个回车使cin将缓冲区的数据读入,然后ctrl+z作为流结束标志,第二个回车引发阻塞式检查,检查到结束标志后输入结束,循环也随之终止。
经过实验,上述方法可行。如果没有第一个回车,则不能正常终止输入,自己理解可能是因为输入缓冲中有数据要读,所以即使按下了ctrl+z 再按回车也不会去检查输入是否结束。
ps:还有一点需要知道,ctrl+z产生的不是一个普通的ASCII码值,也就是说它产生的不是一个字符,所以不会像其它从键盘上输入的字符一样呢鞥够放在输入缓冲区。
- 标准输入cin的返回值以及读入未知数目数据的问题
- 标准输入cin的返回值以及while(cin>>x)的问题
- 标准输入cin的返回值以及while(cin>>x)的问题
- cin>>i的返回值的问题 & cin输入流
- dp-导弹拦截-未知数目数字的读入-stl
- 文件输入cin>>的返回值
- cin输入的问题
- cin>>i的返回值的问题
- cin>>i的返回值的问题
- cin的返回值与while(cin>>x)问题
- C++编程_读入未知数量的输入
- 关于cin>>x的返回值问题
- C++ istream_iterator以及cin输入的一些问题
- 标准输入的原理:cin与scanf
- cin标准输入流的错误处理
- 关于cin输入的问题
- C++ cin输入的问题
- Cin输入流不定数目输入整数结束问题
- Working Practice-先实现再改进
- 异常处理
- Ubuntu 出现apt-get: Package has no installation candidate问题
- 数字电视 frontend tuner demod
- SIO_KEEPALIVE_VALS 用户异常掉线检测
- 标准输入cin的返回值以及读入未知数目数据的问题
- 内联(inline)函数与虚函数(virtual)的讨论
- 16 java ArrayList 类
- 转变-新的开始
- PostQueuedCompletionStatus 与 GetQueuedCompletionStatus
- POJ 1185 炮兵阵地
- STL Map详解
- oracle错误- ora-01950 对表空间无权限
- 计算机专业权威期刊投稿经验总结