2009-03-07 24 views
2

我已經得到了下面的示例: 信令在C++文件流的錯誤

                  
                    #include <iostream> 
#include <fstream> 
using namespace std; 
int main() 
{ 
    ifstream file; 
    cout << file << endl;   // 0xbffff3e4 
    file.open("no such file"); 
    cout << file << endl;   // 0 
    cout << (file == NULL) << endl; // 1 
    cout << file.fail() << endl; // 1 
} 

                  
                

如果該文件是 NULL ,怎麼可能調用 fail 成員函數?我對C++不是很熟悉,這是正常的行爲嗎?我在這裏弄錯了什麼?

回答

3

文件是一個對象 - 它不能爲空。但是,ifstream有一個運算符void *(),當文件處於不良狀態時它將返回0。當你說(舉例):

                        
                          cout << file << endl; 

                        
                      

編譯器把它轉換到:

                        
                          cout << file.operator void*() << endl; 

                        
                      

這種轉換將在各種地方使用 - 基本上任何地方,指針或整數類型可以用於。它是用來當你說:

                        
                          (file == NULL) 

                        
                      

你比較()與NULL的操作無效*返回零零並獲得1

+0

啊。而我的事件嘗試static_cast無效*看看是否有一些超載魔術隱藏在幕後!顯然,這比我預料的還要更多。謝謝。 – zoul 2009-03-07 12:11:31

0

嘗試file.good()或文件轉換爲布爾:

                        
                          file.open("no such file"); 
if (file) 
    cout << "Open OK" << endl; 
else 
    cout << "Open FAILED" << endl; 

                        
                      
+0

謝謝你,但我不是要檢查返回值。我很好奇,我似乎在空對象上調用一個函數,這在其他語言中是不尋常的。 – zoul 2009-03-07 12:09:24