Rückgabewert von ifstream.peek (), wenn das Ende der Datei erreicht
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?
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;
}