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?

È stato utile?

Soluzione

Consulenza lo Standard,

  

Returns: iftraits::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
  • 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 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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top