检查是否已从std :: istream成功读取所有值

时间:2013-01-18 08:05:27

标签: c++ iostream

假设我有一个

的文件
100 text

如果我尝试使用ifstream读取2个数字,则会失败,因为text不是数字。使用fscanf我会通过检查其返回码来知道它失败了:

if (2 != fscanf(f, "%d %d", &a, &b))
    printf("failed");

但是当使用iostream而不是stdio时,我怎么知道它失败了?

2 个答案:

答案 0 :(得分:12)

它实际上是(如果不是更多)简单:

ifstream ifs(filename);
int a, b;
if (!(ifs >> a >> b))
   cerr << "failed";

顺便说一下,习惯这种格式。因为它非常适合非常(通过循环继续积极进展更加如此)。

答案 1 :(得分:3)

如果有人'使用GCC与-std=c++11-std=c++14她可能会遇到:

error: cannot convert ‘std::istream {aka std::basic_istream<char>}’ to ‘bool’

<强>为什么吗 C ++ 11标准使bool运算符调用显式(ref)。因此有必要使用:

std::ifstream ifs(filename);
int a, b;
if (!std::static_cast<bool>(ifs >> a >> b))
  cerr << "failed";

我个人更喜欢下面使用fail功能:

std::ifstream ifs(filename);
int a, b;
ifs >> a >> b
if (ifs.fail())
  cerr << "failed";