2011-06-06 66 views
15

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

我是新的C++,因为我从C来所以不知道我理解这个错误:

cannot call member function ‘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; 
} 

回答

15

你可以简单地这样做:

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(),请在上面的代码中将!input_stream替换为input_stream.fail()

我不知道你在这里想达到什么目的。您正在打开该文件并立即关闭它。你只是试图检查文件是否存在?

+0

您好,感谢您的回答。 HOwever,我只是想知道为什么失败标志从来没有为我工作? – ant2009 2011-06-06 16:53:43

+1

使用'input_stream.fail()'应该和'!input_stream'具有相同的效果。正如我所说的,你不能使用'ios :: fail()',因为它是一个实例方法,而不是静态方法。 – Sven 2011-06-06 16:57:50

+3

请问,为什么在'ifstream'中使用'ios :: in'标志? – nn0p 2015-03-30 16:39:55

1

您必须调用流对象上的fail()。这样做的一个更地道的方式是:

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

if(! input_stream) { 
    return -1; 
} 
3

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

if (input_stream.fail()) 
{ 
    ... 
} 
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/