我目前正在使用类似于 file >> vec[i] 的技术来用文件行中的值填充数组。但是,如果它尝试读取的行不是数字,我如何确定它会返回错误消息?它应该被允许采用整数和双精度数,但不能像“lol”或 3,24,5 这样的东西。
问问题
53 次
3 回答
0
一般模式是检查输入操作的结果:
double d;
if (file >> d) { vec[i] = d; }
else { /* error (now you must handle this before trying again) */ }
如果确实发生了错误,您必须决定下一步要做什么的一些策略——以某种方式跳过它,终止程序等。
于 2013-11-01T20:09:41.687 回答
0
通常,您可以在阅读后检查失败位:
cin>>d;
if(cin.fail())
// we failed! Print an error!
或像这样:
if (not (cin>>d))
// we failed! Print an error!
但是,如果您有很多读取,这可能会很麻烦,因为您将在每次读取后处理错误。
或者,您可以打开在cin
失败时引发异常的选项:
cin.exception(std::ios::failbit);
//...
cin>>d; // will throw on failure
于 2013-11-01T20:10:59.873 回答
0
如果它尝试读取的行不是数字,我如何确定这将返回错误消息?
一种常见的技术是在执行输入后将流位设置为异常掩码。然后您可以根据需要执行清理(或重新抛出异常):
file.exceptions(std::ios_base::goodbit);
while (file >> x)
{
// ...
}
try { file.exceptions(std::ios_base::badbit |
std::ios_base::failbit | std::ios_base::eofbit); }
catch(std::ios_base::failure&)
{
if (file.rdstate() & std::ios_base::failbit)
// ...
if (file.rdstate() & std::ios_base::badbit)
// ...
if (file.rdstate() & std::ios_base::eofbit)
// ...
}
于 2013-11-01T20:34:15.920 回答