Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

03.05.2014, 13:50

alles klar das habe ich verstanden. aber warum löst es das problem wenn er die Instanz "Input" negiert?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

12

03.05.2014, 13:54

good() gibt dir true zurück wenn die Datei fehlerfrei geöffnet wurde.

Anders hätte man auch schreiben können:

C-/C++-Quelltext

1
2
3
if(file.good() == false){ // Fehler }
if(file.good() == true){ // kein Fehler }
if(file.good()){ // kein Fehler }


Ich bin mir gerade nicht ganz sicher ob du close() aufrufen solltest wenn die Datei nicht geöffnet werden konnte. Sicherheitshalber kannst du das aber tun, die Methode schmeißt keinen Fehler wenn nichts offen ist.
Also:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
std::ifstream file("path/to/file.ext");

if(!file.good()){
    file.close();
    return; // Funktion/Methode/whatever hier abbrechen
}

// Kram einlesen

file.close();

13

03.05.2014, 13:55

Kurze Antwort: Mit good() bist du auf der sicheren seite, da diese Funktion auch auf das Ende Der Datei (EOF) prüft. !Input tut das hingegen nicht.

Lange Antwort (Begründung / Hintergründe / Beweis):
Wenn du dir die Definition von std::ios_base::good() anschaust, wie sie DeKugelschreiber schon genannt hat:

C-/C++-Quelltext

1
2
3
4
bool __CLR_OR_THIS_CALL good() const
{   // test if no state bits are set
    return (rdstate() == goodbit);
}


und diese vergleichst mit std::ios_base::fail(), wie sie in std::ios_base::operator!() verwendet wird:

C-/C++-Quelltext

1
2
3
4
bool __CLR_OR_THIS_CALL fail() const
{   // test if badbit or failbit is set in stream state
    return (((int)rdstate() & ((int)badbit | (int)failbit)) != 0);
}


... siehst du, dass der Unterschied zwischen Verwendung des !-operators, bzw. der Funktion good() nur ein anderer Bitvergleich ist.

fail gibt true zurück, wenn in den Statusbytes das 2te (failbit) und 3te (badbit) Bit nicht gesetzt ist. good() gibt true zurück, wenn kein Bit gesetzt ist (goodbit = 0x0)

dazu gibt es noch das erste bit, welches einen EOF-Fehler indiziert. Sollte also das Ende der Datei bereits beim Laden erreicht sein, wird fail() true zurückgeben und good() false.

Edit: Für extrem "harte" fehler, wird noch das 5te Bit gesetzt (0x10). Auch das wird von fail(), also dem !-operator nicht geprüft. Dennoch wird das meines Wissens auch nie gesetzt ^^
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »iSmokiieZz« (03.05.2014, 14:02)


14

03.05.2014, 14:02

Ich glaube jetzt hab ichs verstanden :D
Das hat auch mein aktuelles Problem gelöst. Vielen dank!

Werbeanzeige