【问题标题】:Checking if a file opened successfully with ifstream使用 ifstream 检查文件是否成功打开
【发布时间】:2011-09-09 11:10:37
【问题描述】:

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

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

【问题讨论】:

  • 我更喜欢使用fin文件输入,类似于cin控制台输入)而不是input_stream,因为它是更容易编写,并且完全可以理解它的作用。

标签: c++ io ifstream


【解决方案1】:

你可以这样做:

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

我确实想知道您想在这里实现什么。您正在打开文件并立即再次关闭它。你只是想检查文件是否存在?

【讨论】:

  • 您好,感谢您的回答。但是,我只是想知道为什么失败标志对我不起作用?
  • 使用input_stream.fail() 应该与!input_stream 具有相同的效果。正如我所说,您不能使用ios::fail(),因为它是实例方法,而不是静态方法。
  • 拜托,为什么将ios::in 标志与ifstream 一起使用?
【解决方案2】:

您也可以使用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】:

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

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

    【讨论】:

      【解决方案4】:

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

      input_stream.open(_file_name.c_str(), ios::in);
      
      if( ! input_stream ) {
          return -1;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-05-11
        • 2011-03-13
        • 1970-01-01
        • 2013-08-26
        • 2013-06-23
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        相关资源
        最近更新 更多