valore di ritorno di ifstream.peek () quando raggiunge la fine del file
Domanda
stavo guardando questo articolo sul Cplusplus.com, http: // www .cplusplus.com / riferimento / iostream / istream / peek /
Non sono ancora sicuro di cosa PEEK () ritorni se raggiunge la fine del file.
Nel mio codice, si suppone che una parte del programma da eseguire fintanto che questa affermazione è vera
(sourcefile.peek() != EOF)
dove sourcefile è il mio ifstream.
Tuttavia, non si ferma mai loop, anche se ha raggiunto la fine del file.
non EOF non significa "fine del file"? O stavo usando sbagliato?
Soluzione
Consulenza lo Standard,
Returns: if
traits::eof()
isgood()
false
. In caso contrario, returnsrdbuf()->sgetc()
.
Per quanto riguarda sgetc()
,
Returns:. Se la sequenza di input leggere posizione non è disponibile, torna
underflow()
E underflow
,
Se la sequenza attesa è nullo allora la funzione ritorna
traits::eof()
per indicare il fallimento.
Quindi sì, ritorna EOF
sulla fine del file.
Un modo più semplice per dire è che restituisce int_type
. Dal momento che i valori di int_type
sono solo quelli di char_type
più EOF, sarebbe probabilmente tornare char_type
se EOF non fosse possibile.
Come altri hanno detto, peek
non avanza la posizione del file. È generalmente più semplice e migliore per appena loop su while ( input_stream )
e lasciare mancato ottenimento ingresso aggiuntivo uccidere il processo di analisi.
Altri suggerimenti
Le cose che mi vengono in mente (senza vedere il codice).
-
EOF
potrebbe essere definita in modo diverso da quella prevista ??li> -
sourcefile.peek()
non avanza il puntatore del file. Stai avanzando manualmente in qualche modo, o stai forse cercando costantemente allo stesso personaggio?
EOF è per le funzioni più anziani C-style. Si dovrebbe usare istream::traits_type::eof()
.
Modifica : la visualizzazione dei commenti mi convince che istream::traits_type::eof()
è garantito per restituire lo stesso valore come EOF
, a meno che per caso EOF
è stato ridefinito nel contesto del blocco sorgente. Mentre il consiglio è ancora OK, questo è non è la risposta ??strong> per la questione come pubblicato.
#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;
}