标准输入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码值,也就是说它产生的不是一个字符,所以不会像其它从键盘上输入的字符一样呢鞥够放在输入缓冲区。







0 0
原创粉丝点击