2009-03-07 8 views
2

J'ai l'exemple suivant:signale une erreur dans les flux de fichiers dans 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 
} 

Si le fichier est NULL, comment est-il possible d'appeler la fonction membre fail? Je ne suis pas très familier avec C++, est-ce un comportement normal? Qu'est-ce que je me trompe ici?

Répondre

3
fichier

est un objet - il ne peut pas être nulle. Cependant, ifstream a un opérateur void *() surchargé qui renvoie 0 lorsque le fichier est dans un mauvais état. Quand vous dites (par exemple):

cout << file << endl; 

le compilateur convertit en:

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

Cette conversion sera utilisée dans toutes sortes d'endroits - essentiellement partout qui pourrait être utilisé un type de pointeur ou entier . Il est utilisé lorsque vous dites:

(file == NULL) 

Vous comparez le zéro avec NULL zéro retourné par l'opérateur void *() et obtenir 1.

+0

Ah. Et j'ai essayé static_cast pour annuler * pour voir s'il y avait de la magie surchargée cachée derrière la scène! Apparemment, il y avait encore plus de magie que ce à quoi je m'attendais. Je vous remercie. – zoul

0

Essayez file.good() ou lancer le fichier à bool:

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

Merci, mais je ne cherche pas à vérifier la valeur de retour. Je suis curieux de savoir que j'appelle apparemment une fonction sur un objet nul, ce qui est inhabituel dans d'autres langues. – zoul

Questions connexes