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

32

我有以下代码,将打开一个文件进行读取。但是,我想检查以确保文件已经成功打开,所以我使用fail函数来查看标志是否被设置了。然而,我一直得到以下错误:

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

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

代码:

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;
}

3
我更喜欢使用fin(文件输入,类似于cin是控制台输入)而不是input_stream,因为它更容易编写,并且完全可以理解其功能。 - H-005
4个回答

27

您可以简单地这样做:

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()

我确实想知道你在这里想要实现什么。你打开文件然后立即关闭它。你只是想检查文件是否存在吗?


你好,感谢回答。不过我只是想知道为什么失败标志从来没有对我起作用过? - ant2009
1
使用 input_stream.fail() 应该具有与 !input_stream 相同的效果。正如我所说,您不能使用 ios::fail(),因为它是一个实例方法,而不是静态方法。 - Sven
3
请问,为什么要在使用ifstream时使用ios::in标志? - nn0p

7

您还可以使用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/


5

您的错误是因为您将ios::fail()用作静态方法,实际上它是成员方法。

if (input_stream.fail())
{
    ...
}

3
你需要在流对象上调用fail()。更加惯用的方法是:
input_stream.open(_file_name.c_str(), ios::in);

if( ! input_stream ) {
    return -1;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接