istream(ostream)对比布尔

时间:2014-04-09 06:03:27

标签: c++ types casting

这是一个读取尽可能多的单词的C ++代码 从给定的文本文件中尽可能直到它满足EOF。

string text;
fstream inputStream;


inputStream.open("filename.txt");

while (inputStream >> text)
    cout << text << endl;

inputStream.close();

我的问题是:

  • 将while循环的条件(即inputStream&gt;&gt; text)转换为布尔值(即true或false)后,究竟执行了什么程序?

我对这个问题的回答是:

  • 根据我的理解,inputStream&gt;&gt;文本应该返回另一个(文件)输入流。当EOF到达时,流似乎为NULL。 NULL可以定义为0,等于false。

我的回答有意义吗?即使我的回答确实有意义,将InputStream转换为bool并不能让我感到舒服。 :)

2 个答案:

答案 0 :(得分:11)

  

在将while循环的条件(即inputStream&gt;&gt; text)转换为布尔值(即true或false)时,究竟执行了什么程序?

operator>>返回对流的引用。

在C ++ 11中,引用随后由流的bool函数转换为operator bool(),该函数返回等效的!fail()

在C ++ 98中,使用operator void*()实现了同样的目的,返回的指针是NULL表示失败,如果fail()为假,则为非空指针,然后在bool评估中隐式转换为while

答案 1 :(得分:0)

我知道我的答案已经被user657267完美回答。但是我又添加了一个例子来更容易地理解答案。

// evaluating a stream
#include <iostream>     // std::cerr
#include <fstream>      // std::ifstream

int main () {
  std::ifstream is;
  is.open ("test.txt");
  if (is) {           <===== Here, an example of converting ifstream into bool
    // read file
  }
  else {
    std::cerr << "Error opening 'test.txt'\n";
  }
  return 0;
}

参考http://www.cplusplus.com/reference/ios/ios/operator_bool/