在windows10和VS2017下:
我试图使用istream从键盘读取双数1.1
并将其放入int类型变量,比如temp
。原因temp
是1
但是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;
}
请记住,当您从键盘上阅读1.1
时,您正在阅读文本。程序会查看该文本并决定它所代表的值,具体取决于您正在读取的变量的类型。如果您正在读入int
,输入例程会读取第一个'1',然后看到'。',它不能成为int
的文本表示的一部分,并且它会停止读取。您的变量获取值1.如果您尝试从同一输入流中读取另一个int
,那么'。'将立即停止读取,因为它不能成为int
的一部分,并且尝试输入失败。
简短的回答:不要这样做。如果您的输入文本看起来像浮点,请将其作为浮点读取。
试试这个:
#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
,并且.
正在抛出错误。上面的部分用于读取字符并将它们保存在字符串中。