如果用户要输入字母而不是整数,循环就会变得疯狂。 我知道如何摆脱那个错误
cin.clear() and cin.ignore()
但我一直无法理解为什么会这样。字符由 0 到 255 之间的整数表示。每个数字都是 32 位,足以让整数变量处理。那么为什么流会失败呢?
是否可以使用异常来测试此错误,我试图了解异常,但我无法为此编写代码。
最佳答案
为什么他们这样工作:
流运算符 >> 和 << 旨在读取文本(或人类可读流(或文件))。因此,在使用时,您期望具有特定形式的特定类型的输入:
int a;
stream >> a; // I expect the stream to contain an integer in human readable form.
MyClass x;
stream >> x; // I expect the class to contain a serialize version of x;
如果一个 char 被自动转换成一个整数,流将不会像大多数人期望的流操作符那样工作(即阅读人类可读的形式)。也就是说,你知道 'z' 的 ASCII 值应该是多少吗?您甚至不知道您的平台是否将字符表示为 ASCII?等有很多问题,如果我们走这条路,只有一半知道。
现在,如果您想将文件视为二进制值。您可以读出单个字节并将其视为整数。
char y;
stream.read(&y, 1); // Read a single byte into y
int x = y; // now convert the byte to an integer.
转向异常:
当您将错误与处理分开处理时,异常是很好的。当您有巨大的文件并且文件输入中的错误通常意味着损坏并且您应该停止处理时,这很好。那么异常就是完美的解决方案。
但是简单的例子虽然你通常是在处理用户输入。检测和修复用户输入通常在处理现场完成,因此异常不是解决问题的最佳方案。
std::cout << "Enter a number\n";
int number;
while(!(std::cin >> number))
{
std::cout << "That was not a number\n";
std::cin.clear();
std::cin.ignore();
}
// With exceptions:
// That's too much work.
但是如果我正在处理一个谷歌索引:
// If the read fails get out of here with an exception.
while(data >> x >> y >> z >> j >> q >> p >> src >> dst)
{
doWork();
}
ExapndAndGrok();
// Handling the errors:
while(data >> x >> y >> z >> j >> q >> p >> src >> dst)
{
doWork();
}
if (testDataStreamForSomeError(data)) // EOF is not an error.
{
throw someException("The input failed");
}
ExapndAndGrok();
关于c++ - 坏流中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5923297/