使用ifstream检查文件是否成功打开

时间:2011-06-06 16:49:58

标签: c++ io ifstream

我有以下内容将打开一个文件进行阅读。但是,我想检查以确保文件已成功打开,因此我使用失败来查看是否已设置标志。但是,我一直收到以下错误:

我是C ++的新手,因为我来自C。所以我不确定我是否理解这个错误:

  

无法调用成员函数'bool std :: basic_ios< _CharT,   _Traits> :: fail()const [with _CharT = char,_Traits = std :: char_traits]'without object

代码:

int devices::open_file(std::string _file_name)
{
    ifstream input_stream;

    input_stream.open(_file_name.c_str(), ios::in);

    if(ios::fail() == true) {
        return -1;
    }

    file_name = _file_name;

    return 0;
}

4 个答案:

答案 0 :(得分:19)

你可以这样做:

int devices::open_file(std::string _file_name)
{
    ifstream input_stream;    
    input_stream.open(_file_name.c_str(), ios::in);
    if(!input_stream)
    {
        return -1;
    } 
    file_name = _file_name;
    return 0;
}

fail()不是静态方法,您必须在不是类型的实例上调用它,因此如果要使用fail(),请在上面的代码中将!input_stream替换为input_stream.fail()

我不得不怀疑你在这里想要实现的目标。您正在打开该文件并立即再次关闭它。您只是想检查文件是否存在吗?

答案 1 :(得分:3)

您的错误是因为当ios::fail()实际上是成员方法时,您使用if (input_stream.fail()) { ... } 作为静态方法。

{{1}}

答案 2 :(得分:3)

您也可以使用std::ifstream::is_open。如果文件已打开并与此流对象关联,则返回true。

// ifstream::is_open
#include <iostream>     // std::cout
#include <fstream>      // std::ifstream

int main () {
  std::ifstream ifs ("test.txt");

  if (ifs.is_open()) {
    // print file:
    char c = ifs.get();
    while (ifs.good()) {
      std::cout << c;
      c = ifs.get();
    }
  }
  else {
    // show message:
    std::cout << "Error opening file";
  }

  return 0;
}

http://www.cplusplus.com/reference/fstream/ifstream/is_open/

答案 3 :(得分:1)

您必须在流对象上调用fail()。更为惯用的方法是:

input_stream.open(_file_name.c_str(), ios::in);

if( ! input_stream ) {
    return -1;
}