Frage

Ich war in diesem Artikel suchen auf Cplusplus.com, http: // www .cplusplus.com / reference / iostream / istream / Maximal- /

Ich bin sicher, dass immer noch nicht, was peek () zurückkehrt, wenn er das Ende der Datei erreicht.

In meinem Code, ein Teil des Programms sollte so lange laufen, wie diese Aussage wahr ist

(sourcefile.peek() != EOF)

Dabei steht Quell ist mein ifstream.

Es ist jedoch nie aufhört Looping, obwohl es das Ende der Datei erreicht hat.

Does EOF nicht mean "End of File"? Oder war ich es falsch verwenden?

War es hilfreich?

Lösung

Die Consulting-Standard,

Returns: traits::eof() ifgood()isfalse. Andernfalls returnsrdbuf()->sgetc().

Wie bei sgetc(),

. Rückkehr: Wenn die Eingangssequenz Position gelesen nicht verfügbar ist, kehrt underflow()

Und underflow,

Wenn die anstehende Sequenz null ist dann die Funktion zurück traits::eof() Fehler anzuzeigen.

So yep, kehrt EOF auf das Ende der Datei.

Ein einfacher Weg ist, zu sagen, dass es int_type zurückgibt. Da die Werte von int_type sind nur wahrscheinlich diejenigen von char_type und EOF, es würde zurückkehren char_type wenn EOF nicht möglich waren.

Wie andere schon erwähnt, ist peek nicht die Dateiposition vorzurücken. Es ist in der Regel am einfachsten und am besten, nur Schleife auf while ( input_stream ) und läßt Ausfall erhalten zusätzliche Eingabe den Parsing-Prozess töten.

Andere Tipps

Dinge, die den Sinn kommen (ohne den Code zu sehen).

  • EOF definiert werden könnten anders als erwartet
  • sourcefile.peek() nicht vorab den Dateizeiger. Sind Sie es manuell irgendwie voran, oder suchen Sie vielleicht ständig auf dem gleichen Charakter?

EOF ist für die älteren C-Stil-Funktionen. Sie sollten istream::traits_type::eof() verwenden.

Bearbeiten : Betrachten Sie die Kommentare überzeugt mich, dass istream::traits_type::eof() garantiert den gleichen Wert wie EOF zurückzukehren, es sei denn durch Zufall EOF hat im Rahmen des Quellenblocks neu definiert. Während der Rat noch in Ordnung ist, ist dies nicht die Antwort auf die Frage, wie geschrieben.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
//myifstream_peek1.cpp
int main()
{
 char ch1, ch2;
 ifstream readtext2;
 readtext2.open("mypeek.txt");
 while(readtext2.good())
 {
 if(readtext2.good())
 {
  ch2 = readtext2.get();   cout<< ch2;
 }
 }
   readtext2.close();
 //
 ifstream readtext1;
 readtext1.open("mypeek.txt");
 while(readtext1.good())
    {
    if(readtext1.good())
     {

        ch2 = readtext1.get();
        if(ch2 ==';')
            {
             ch1= readtext1.peek();
             cout<<ch1;  exit(1);
            }
            else {  cout<<ch2; }
        }

    }
    cout<<"\n end of ifstream peeking";
   readtext1.close();
return 0;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top