C++:将ifstream转换为bool并使用ifstream :: is_open()之间的区别

The*_*ist 5 c++ fstream casting ifstream ofstream

也许是一个虚假的问题,但我需要一个明确的答案.在返回任何这些功能时是否有任何不同

int FileExists(const std::string& filename)
{
  ifstream file(filename.c_str());
  return !!file;
}

int FileExists(const std::string& filename)
{
  ifstream file(filename.c_str());
  return file.is_open();
}
Run Code Online (Sandbox Code Playgroud)

换句话说,我的问题是:将fstream转换为bool会给出与fstream :: is_open()完全相同的结果吗?

Zet*_*eta 10

否.is_open仅检查是否存在关联文件,而转换bool也检查文件是否已准备好进行I/O操作(例如,流处于良好状态)(自C++ 11起).

is_open

检查文件流是否具有关联文件.

std::basic_ios::operator bool

如果流没有发生错误并且已准备好进行I/O操作,则返回true.具体来说,回报!fail().

  • @SamerAfach:`ifstream file("test.txt"); int i; 档案>> i;`.如果`test.txt`存在,是空的并且可以打开,`file.is_open()`是真的,但是整数的提取失败并且`!! file`是假的.请注意,错误的`is_open` _always_暗示`!! file`为false. (2认同)