2 Stimmen

Signalisierung eines Fehlers in Dateiströmen in C++

Ich habe das folgende Beispiel erhalten:

#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
}

Wenn die Datei NULL wie ist es möglich, die fail Mitgliedsfunktion? Ich bin nicht sehr vertraut mit C++, ist dieses Verhalten normal? Was mache ich hier falsch?

3voto

File ist ein Objekt - es kann nicht null sein. Allerdings verfügt ifstream über eine Überladung des Operators void*(), die 0 zurückgibt, wenn sich die Datei in einem schlechten Zustand befindet. Wenn Sie (zum Beispiel) sagen:

cout << file << endl;

konvertiert der Compiler dies in:

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

Diese Konvertierung wird an allen möglichen Stellen verwendet - im Grunde überall, wo ein Zeiger oder ein Integer-Typ verwendet werden kann. Sie wird verwendet, wenn Sie sagen:

(file == NULL)

Sie vergleichen die vom Operator void*() zurückgegebene Null mit NULL und erhalten 1.

0voto

kyku Punkte 5658

Versuchen Sie file.good() oder setzen Sie die Datei auf bool:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X