0

我目前正在使用类似于 file >> vec[i] 的技术来用文件行中的值填充数组。但是,如果它尝试读取的行不是数字,我如何确定它会返回错误消息?它应该被允许采用整数和双精度数,但不能像“lol”或 3,24,5 这样的东西。

4

3 回答 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 回答