Pregunta

yo estaba buscando en este artículo sobre Cplusplus.com, http: // www .cplusplus.com / referencia / iostream / istream / peek /

Todavía no estoy seguro de lo peek () devoluciones si se llega al final del archivo.

En mi código, una parte del programa se supone que debe funcionar siempre que esta afirmación es cierta

(sourcefile.peek() != EOF)

donde SourceFile es mi ifstream.

Sin embargo, nunca deja de bucle, a pesar de que ha alcanzado el final del archivo.

¿El EOF no significa "Fin del archivo"? O estaba usando mal?

¿Fue útil?

Solución

La consulta del estándar,

Devuelve: iftraits::eof()isgood() false. De lo contrario, returnsrdbuf()->sgetc().

En cuanto a sgetc(),

Las devoluciones:. Si la secuencia de entrada leer la posición no está disponible, vuelve underflow()

Y underflow,

Si la secuencia de pendiente es nulo entonces la función devuelve traits::eof() para indicar fallo.

Así que sí, vuelve EOF el final del archivo.

Una forma más fácil de decir es que se vuelve int_type. Como los valores de int_type son sólo los de char_type más EOF, es probable que volver char_type si EOF no fuera posible.

Como han mencionado otros, peek no avanza la posición del archivo. Por lo general es más fácil y mejor solo bucle en while ( input_stream ) y dejar que la no obtención de entrada adicional matan el proceso de análisis.

Otros consejos

Las cosas que vienen a la mente (sin ver su código).

  • EOF podría definirse de manera diferente de lo esperado
  • sourcefile.peek() no avanza el puntero del archivo. ¿Está avanzando de forma manual alguna manera, o tal vez estás constantemente buscando al mismo personaje?

EOF es para las funciones de tipo C de más edad. Debe utilizar istream::traits_type::eof().

Editar : la visualización de los comentarios me convence de que istream::traits_type::eof() está garantizado para devolver el mismo valor que EOF, a menos que por casualidad EOF se ha redefinido en el contexto de su bloque fuente. Mientras que el consejo es aún está bien, esto es no es la respuesta a la pregunta tal como fue anunciado.

#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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top