2011-06-06 67 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/