不了解istream :: read的cplusplus.com示例

时间:2016-02-16 11:34:30

标签: c++ istream

在cplusplus.com上给出了一个例子:

// read a file into memory
#include <iostream>     // std::cout
#include <fstream>      // std::ifstream

int main () {

  std::ifstream is ("test.txt", std::ifstream::binary);
  if (is) {
    // get length of file:
    is.seekg (0, is.end);
    int length = is.tellg();
    is.seekg (0, is.beg);

    char * buffer = new char [length];

    std::cout << "Reading " << length << " characters... ";
    // read data as a block:
    is.read (buffer,length);

    if (is)
      std::cout << "all characters read successfully.";
    else
      std::cout << "error: only " << is.gcount() << " could be read";
    is.close();

    // ...buffer contains the entire file...

    delete[] buffer;
  }
  return 0;
}

有人可以解释为什么最后if (is)可以确定是否已读取所有字符?如果我们已经进入的语句和我解释它的方式(可能过于简单和错误)我们只检查是否存在,但是这已经建立了吗?

2 个答案:

答案 0 :(得分:3)

std::ifstream有一个转化运算符bool,它返回是否在流上设置了badbitfailbit

它基本上是if (!is.fail()) {/*...*/}的缩写。

答案 1 :(得分:1)

std::ifstream定义operator bool() const,它隐式地将流转换为布尔值。

来自运营商bool()的cplusplus.com:

  

返回是否设置了错误标志(failbit或badbit)。

     

请注意,此函数不会返回与成员商品相同的功能,但是   成员的反面失败。

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