C++ 为什么即使输入有效,cin.failbit也始终设置?
我试图编写一个程序,要求使用C++ 为什么即使输入有效,cin.failbit也始终设置?,c++,arrays,cin,getline,C++,Arrays,Cin,Getline,我试图编写一个程序,要求使用cin.getline()输入一个字符数组,如果给定的输入大于数组长度,数组就会扩展 我使用了cin.failbit来查看用户的输入是否太长。但一切都不顺利。所以在调试之后,我发现问题在于failbit 所以我写了一个简单的程序来看看它到底出了什么问题,结果是,cin.failbit总是在if语句中返回true,即使输入看起来有效 int main () { char name[256]; std::cout << "Enter your
cin.getline()
输入一个字符数组,如果给定的输入大于数组长度,数组就会扩展
我使用了cin.failbit
来查看用户的输入是否太长。但一切都不顺利。所以在调试之后,我发现问题在于failbit
所以我写了一个简单的程序来看看它到底出了什么问题,结果是,cin.failbit
总是在if语句中返回true,即使输入看起来有效
int main () {
char name[256];
std::cout << "Enter your name: ";
std::cin.getline (name,256, '\n');
std::cout << "characters read: " << std::cin.gcount() << std::endl;
if (std::cin.failbit){
std::cin.clear();
std::cout << "failed\n";
}
}
int main(){
字符名[256];
std::cout是一个常量,指示哪些错误位表示流失败。它不是流当前状态的指示。若要检查是否设置了该位,请改用成员函数
但是,如果由于到达流的末尾而导致流读取失败fail()
将返回false
使您相信它成功了。希望检查最后一个操作是否成功。是一个常量,指示哪个错误位表示流失败。它不是流当前状态的指示。若要检查该位是否已设置,请改用成员函数
但是,如果由于到达流的末尾而导致流读取失败,fail()
将返回false
,使您相信它成功了。请检查最后一次操作是否成功。@fran请在回答中回答而不是注释。FWIW如果(!std::cin),您可以使用
而是检查流是否处于失败状态。我错了,没有failbit
成员函数。它检查的值不是零。我想到的是fail()
成员函数。std::cin.failbit
是一个常量,指示哪个位表示失败状态,它没有检查流的状态。感谢回复。我考虑过使用cin.fail()或者!cin,但当用户的输入长度超过数组的len时,不会调用它们。用户的输入只是被剪切,超过数组大小的所有字符都保留在缓冲区中(至少我观察到了这一点)@keptt不,failbit
不是状态意义上的标志。它表示哪个位与该标志关联。它不能设置或清除,它是一个常量。“thefailbit
标志”表示“位掩码failbit
指示的位”。@fran请回答而不是注释。FWIW如果(!std::cin)
来检查流是否处于失败状态。我错了,没有failbit
成员函数。它正在检查的值不是零。我正在考虑fail()
成员函数。std::cin.failbit
是一个常量,指示哪个位表示失败状态,它没有检查流的状态。感谢回复。我考虑过使用cin.fail()或者!cin,但当用户的输入长度超过数组的len时,不会调用它们。用户的输入只是被剪切,超过数组大小的所有字符都保留在缓冲区中(至少我观察到了这一点)@keptt否,failbit
不是状态意义上的标志。它指示哪个位与该标志关联。它不能设置或清除,它是一个常量。“failbit
标志”表示“位掩码failbit
指示的位”。我很感激您的回答,但对我来说,关于failbit的部分只会干扰getline description第4块此处的说明:“如果函数未提取任何字符,或者在(n-1)个字符写入s后未找到分隔字符,则设置failbit标志”.所以对我来说confusing@keptt错误状态存储在一个位集中。failbit
是一个常量,指示哪个位表示失败。例如,它的值可能是常量8
,指示第四位表示失败。在这种情况下,if
基本上是if(8)
并且不考虑流的当前状态。failbit
的一个使用示例可能是std::cin.rdstate()&std::ios_base::failbit
,以查看failbit
在rdstate()返回的位集中是否为1
。谢谢,我想我现在明白了。我试着按照你的建议去做,并使用了cin.good()-到目前为止效果还不错。不要太烦人,但你介意我问一下如何处理failbit吗?如果它是一个常量,那么它应该有某种默认值,如果我键入smth like-If(cin.failbit==默认值)这意味着没有检测到可能触发故障位的错误,一切正常。是这样吗?@keptt no.failbit
与cin
的状态无关。假设它是一个全局常量(因为它就是这样的)。您无法从中提取有用的信息,它是一个数字,并且在您的程序的生命周期中始终是该数字。想象一下,无论您在哪里看到failbit
,它都只会说4
,或16
,或它具有的任何值。它在程序的生命周期中无法更改。它的唯一用途是作为bitm请求帮助您解释由rdstate()
返回的值。std::cin.failbit
编译的事实是误导性的。failbit
是一个static constexpr
。我很感谢您的回答,但对我来说,关于failbit的部分只是干扰了getline描述,这里的第四块指出:'如果函数未提取任何字符,或者在(n-1)个字符写入s后未找到定界字符,则设置failbit标志所以对我来说confusing@keptt错误状态存储在位集中。failbit
是一个常量,指示哪些位表示失败。例如,它的值可能是