为什么可以将ifstream文件置于if条件中?

时间:2019-09-06 08:38:26

标签: c++ implicit-conversion

我正在尝试检查文件是否成功打开。我发现这种方法可以打开要读取的文件:

char path[]="data/configuration.txt";
std::ifstream configFile(path, std::ifstream::in);
if(configFile) {
  std::cout<<"Successfully opened file: "<<path<<std::endl;
} else {
  std::cout<<"Error, Could not open file: "<<path<<std::endl;
}

问题是if到底要检查什么?

因为我还发现了以下检查文件是否打开的方法:

char path[]="data/configuration.txt";
std::ifstream configFile;
configFile.open(path, std::ifstream::in);
if(configFile.is_open()) {
  std::cout<<"Successfully opened file: "<<path<<std::endl;
} else {
  std::cout<<"Error, Could not open file: "<<path<<std::endl;
}

我还有其他问题。例如,两种打开文件的方法有什么区别?另外,两个if条件有什么区别?

我认为这些是相似的方法,最终会得到相同的结果,因为我可以同时使用std::ifstreamis_open这两种打开方法:

std::ifstream configFile(path, std::ifstream::in);
configFile.open(path, std::ifstream::in);

1 个答案:

答案 0 :(得分:8)

std::ifstream可以通过contextually convert to bool std::basic_ios<CharT,Traits>::operator bool ,而std::basic_ifstream<CharT,Traits>::is_open是从std::basic_ios继承的。

  

如果流没有错误并且可以进行I / O操作,则返回true。具体来说,返回!fail()

请注意,它会对{{3}}执行不同的检查。

  

检查文件流是否具有关联文件。有效地调用rdbuf()->is_open()