Erläuterung zur Verwendung von Flagbit zum Setzen des internen Fehlerflags

8

In C ++ Primer habe ich diesen Code gefunden:

%Vor%

Ich bin verwirrt, warum die istream::failbit verwendet wird, um das Fehlerzustandsflag zu setzen, ich meine, dass, seit der Fehler aufgetreten ist (daher ist der Fluss jetzt in wenn Block dann das Failbit muss gesetzt sein, warum benutzen sie es, um das Fehler-Flag erneut zu setzen. Wo liege ich falsch, wenn ich das verstehe?

BEARBEITEN: Das Buch sagt "Wir drucken eine Warnung und löschen den failbit Status", aber IMO clear (istream :: failbit) setzt den aktuellen Status von stream mit dem Wert in Failbit. Also, warum das Buch den Status des Streams mit dem von Failbit setzt, da es das Funktionieren von cin verhindert, da es im Fehlerzustand ist. ++++ Über welchen Status eines Streams wird eigentlich gesprochen, ob E-Bit, Badbit, Goodbit, Failbit oder eine Kombination davon? Wie kann ich den Wert dieser einzelnen Bits auch wissen?

    
Gaurav 12.08.2017, 08:04
quelle

1 Antwort

1

std :: basic_ios :: clear

%Vor%

Legt die Flags für den Status der Streamfehler fest, indem sie ihnen den Wert state zuweisen. Standardmäßig wird std::ios_base::goodbit zugewiesen, was dazu führt, dass alle Fehlerstatusflags gelöscht werden.

Wenn rdbuf() ein Nullzeiger ist (d. h. es gibt keinen zugeordneten Strompuffer), wird state | badbit zugewiesen. Kann eine Ausnahme auslösen.

Im Wesentlichen bedeutet in diesem Fall das Setzen des Bits, dass das Bit auf clear gesetzt wird.

Wenn Sie "clear" ohne Parameter aufrufen, werden alle Bits auf "clear" gesetzt, indem "goodbit" gesetzt wird, was nur für andere Zustände gilt. Wenn Sie nur ein bestimmtes Bit markieren, wird nur dieses Bit gesetzt und andere Bits gelöscht (und auch ein gutes Bit). Wie auch immer, wenn, wie oben erwähnt, während des Aufrufs dieser Methode der Eingabepuffer des Streams ungültig ist, setzt clear() auch badbit auf true, so dass die Methode good() und operator bool false und fail() zurückgibt. gibt immer noch true zurück.

Um zu wissen, warum man diese Bits löschen muss, aber einen Fehlerzustand behält, hängt von weiterem Code ab, oft ist es in der Lage zu erkennen, dass ein Fehler aufgetreten ist, aber in der Lage ist, mehr Daten vom Strom anzufordern (nach korrekter Eingabe fragen) ?)

%Vor%

Ohne den Aufruf von ::clear(std::istream::failbit) und ::ignore würde die Schleife für immer funktionieren, weil der Zustand der Flags und des Puffers einen wiederholten Versuch des gleichen Pufferinhalts erzwingen würde. In Wirklichkeit können Sie versuchen, diesen Punkt zu analysieren, z. Lies die Zeichenfolge und drucke sie aus. Es wäre in Ordnung, nur clear() aufzurufen, aber dann müssen wir ein eigenes Flag erstellen, mit dem wir richtig reagieren können.

Der "state" von stream ist ein privates Feld vom Typ std::ios_base::iostate , dessen Wert einer binären Kombination der Konstanten eofbit , badbit und failbit entspricht. goodbit constant ist gleich Null und repräsentiert den fehlerfreien Zustand. Zwei Accessoren, die Lese- und Schreibvorgänge für dieses Feld bereitstellen:

%Vor%

Beachten Sie, setstate(state) hat den Effekt von clear(rdstate() | state) , was bedeutet, dass, wenn clear den genauen Wert von iostate setzen kann, setstate nur neue Bits auf true setzen kann, aber keine bereits gesetzten Bits löschen kann.

%Vor%

Für jedes Bit gibt es Accessoren: fail() , bad() , eof() , good() . Im Wesentlichen gibt fail() true zurück, wenn (rdstate()|std::ios_base::failbit) != 0 usw. (Siehe 30.5.5.4 basic_ios Flags-Funktionen, ISO / IEC 14882: 2017, Programmierung Sprachen - C ++)

  • operator bool ist definiert und gibt good() zurück
  • operator! ist definiert und gibt !good() zurück

Die Zeile

%Vor%

kann durch

ersetzt werden %Vor%

, weil letzteres zu einer kontextuellen Konvertierung in bool führt.

Effekte, die mit Bits iostate verknüpft sind (nach ISO C ++):

  
  • badbit zeigt einen Verlust der Integrität in einer Eingabe- oder Ausgabesequenz an (z. B. einen nicht behebbaren Lesefehler aus einer Datei);
  •   
  • eofbit zeigt an, dass eine Eingabeoperation das Ende einer Eingabesequenz erreicht hat;
  •   
  • failbit gibt an, dass eine Eingabeoperation die erwarteten Zeichen nicht lesen konnte oder dass eine Ausgabeoperation nicht generiert werden konnte   die gewünschten Zeichen.
  •   
    
Swift 12.08.2017, 08:40
quelle

Tags und Links