使用istream计数错误将double输入int变量

时间:2019-04-16 10:02:49

标签: c++ iostream

在Windows10和VS2017下:

我试图使用istream从键盘读取一个双精度数字1.1,并将其放入一个int型变量中,例如temp。原因temp1,但istream似乎停留在某些错误状态。出于预期,istream应该停止并等待键盘输入,但是它将继续进行另一轮读缓冲区,并且这次会发生错误。

我检查了rdstate(),在第二轮读取缓冲区后它等于2。我知道这很异常,但是为什么呢?

要进行复制,请运行代码,在控制台中键入1.1,然后按Enter,将显示错误。


实际上,出于某些原因,我使用int32尝试存储double。该程序应该从键盘打印有效输入。这里的有效是指输入不应超过int32的范围或为double /可读字符。否则,程序应在屏幕上打印Invalid input

#include <iostream>

std::istream& f(std::istream &in) {
    int temp = 0;
    while(true) { 
        while (in >> temp) {
            if (temp == -1) {
                break;
            }
            std::cout << temp << std::endl;
        }
        if (in.eof()|| temp == -1) break;
        if (!in) {
            std::cout << "Invalid input"  << std::endl;
            in.clear();
            in.ignore(10000,32);
        }
    }
    in.seekg(0, std::ios::beg);
    return in;
}

int main(){
    std::cout << "Please input some integers and end with ^Z or -1" << std::endl;
    f(std::cin);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

尝试一下:

#include <iostream>

std::istream& f(std::istream &in) {
    std::string temp = "";
    while(true) { 
        while (in >> temp) {
            if (temp == "-1") {
                break;
            }
            std::cout << temp << std::endl;
        }
        if (in.eof()|| temp == "-1") break;
        if (!in) {
            std::cout << "Invalid input"  << std::endl;
            in.clear();
            in.ignore(10000,32);
        }
    }
    in.seekg(0, std::ios::beg);
    return in;
}

int main(){
    std::cout << "Please input some integers and end with ^Z or -1" << std::endl;
    f(std::cin);
    return 0;
}

您正在从缓冲区中逐字符解析。您不能将字符放入整数。假设您正在从流中读取1.1,但是从缓冲区中读取1.1,而.是抛出错误。上面的部分在您读取字符并将其保留在字符串中时起作用。

答案 1 :(得分:0)

请记住,当您从键盘上阅读1.1时,您正在阅读的是文本。程序将查看该文本,并根据您要读入的变量的类型来决定其代表的值。如果您正在读int,则输入例程将读取第一个'1',然后看到'。',该字符不能成为int的文本表示形式的一部分,并且它将停止阅读。您的变量的值为1。如果您尝试从同一输入流中读取另一个int,则为'。'。将立即停止读取,因为它不能成为int的一部分,并且尝试输入失败。

简短的回答:不要那样做。如果您输入的文本看起来像浮点,则将其读为浮点。