Heim > Backend-Entwicklung > C++ > Warum verhält sich „ifstream::eof()' bei „get()' und dem Extraktionsoperator („>>') unterschiedlich?

Warum verhält sich „ifstream::eof()' bei „get()' und dem Extraktionsoperator („>>') unterschiedlich?

DDD
Freigeben: 2024-12-02 06:36:11
Original
1020 Leute haben es durchsucht

Why Does `ifstream::eof()` Behave Differently with `get()` and the Extraction Operator (`>>`)?
>`)? " />

Eintauchen in die Funktion eof() von ifstream

Das Verhalten der Funktion eof() von ifstream zu verstehen, kann rätselhaft sein, wie im bereitgestellten Codeausschnitt dargestellt:

</p>
<h1>einschließen <iostream></h1>
<h1>include <fstream></h1>
<p>int main() {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">std::fstream inf( "ex.txt", std::ios::in );
while( !inf.eof() ) {
    std::cout << inf.get() << "\n";
}
inf.close();
inf.clear();
inf.open( "ex.txt", std::ios::in );
char c;
while( inf >> c ) {
    std::cout << c << "\n";
}
return 0;
Nach dem Login kopieren

}

Schauen wir uns die Erklärung genauer an:

Wenn EOF wirklich Setzt ein

Die Funktion eof() erkennt, wenn ein Lesevorgang versucht, auf Daten über das Ende der Datei hinaus zuzugreifen. Das bedeutet:

  • Wenn Sie eine Datei haben mit dem Inhalt „abc“ und dem Lesen von 3 Zeichen wird eof() falsch sein.
  • Aber wenn Sie versuchen, ein 4. Zeichen zu lesen, wird eof() zu wahr, was darauf hinweist, dass das Ende der Datei erreicht wurde.

Der Grund für dieses Verhalten besteht darin, die Kompatibilität mit verschiedenen Geräten wie Rohren und Steckdosen sicherzustellen, bei denen das Konzept der Dateigröße möglicherweise nicht zutrifft so einfach wie mit einer Textdatei.

Enthüllung der Magie von get() und >>

Die beiden Schleifen Verwenden Sie im Code-Snippet verschiedene Ansätze, um den Inhalt der Datei zu lesen:

  • Die erste Schleife verwendet inf.get(), um Zeichen einzeln abzurufen. Wenn das Ende der Datei erreicht ist, gibt get() -1 zurück.
  • Die zweite Schleife verwendet inf >> c, das einen Leseversuch und eine Zuweisung in einem Vorgang kombiniert. Dieser Ansatz setzt c auf den aus der Datei gelesenen Wert, aber wenn der Lesevorgang fehlschlägt (weil das Ende der Datei erreicht ist), wird er als falsch ausgewertet und die Schleife beendet.

Dies erklärt, warum Die erste Schleife liest ein zusätzliches Zeichen und zeigt -1 an, während die zweite Schleife die korrekte Ausgabe liefert – sie beendet die Schleife, bevor versucht wird, über das Ende hinaus zu lesen Datei.

Die Gefahren von -1 vermeiden

Um sich nicht auf die magische Zahl -1 zu verlassen, um das Ende der Datei zu identifizieren, wird empfohlen, std zu verwenden: :char_traits::eof() oder std::istream::traits_type::eof() stattdessen.

Das obige ist der detaillierte Inhalt vonWarum verhält sich „ifstream::eof()' bei „get()' und dem Extraktionsoperator („>>') unterschiedlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage