在Windows10和VS2017下:
我试图使用istream从键盘读取一个双精度数字1.1
,并将其放入一个int型变量中,例如temp
。原因temp
是1
,但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;
}
答案 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
的一部分,并且尝试输入失败。
简短的回答:不要那样做。如果您输入的文本看起来像浮点,则将其读为浮点。