使用istream encounting错误将double输入到int变量中

问题描述 投票:1回答:2

在windows10和VS2017下:

我试图使用istream从键盘读取双数1.1并将其放入int类型变量,比如temp。原因temp1但是istream似乎陷入了一些错误状态。在期望中,istream应该停止并等待键盘输入,但它会继续另一轮读取缓冲区,这次会发生错误。

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

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


实际上,由于某些原因,我使用int32尝试存储double。程序应该从键盘打印有效输入。这里有效是指输入不应超过int32的范围或是双/可读字符。否则程序应该在屏幕上打印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;
}
c++ iostream
2个回答
0
投票

请记住,当您从键盘上阅读1.1时,您正在阅读文本。程序会查看该文本并决定它所代表的值,具体取决于您正在读取的变量的类型。如果您正在读入int,输入例程会读取第一个'1',然后看到'。',它不能成为int的文本表示的一部分,并且它会停止读取。您的变量获取值1.如果您尝试从同一输入流中读取另一个int,那么'。'将立即停止读取,因为它不能成为int的一部分,并且尝试输入失败。

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


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,并且.正在抛出错误。上面的部分用于读取字符并将它们保存在字符串中。

© www.soinside.com 2019 - 2024. All rights reserved.