Red de conocimiento informático - Aprendizaje de código fuente - Fin del archivo EOF

Fin del archivo EOF

Oh, esto no es lo que decía el primer piso. eof es el signo del final del archivo, de hecho es -1. Puedes modificar ligeramente el programa del cartel original para demostrarlo:

while(!in.eof())

{

p>

temp = in.get();

cout<

}

En este momento, encontrará que la última salida antes del recuento es -1.

Pero, ¿por qué es -1 (es decir? , el símbolo de fin de archivo) ¿salida? in.eof() devuelve la variable EOF en in. Esta variable se convertirá en 1 cuando in lea el final del archivo. En otras palabras, solo cuando in.get() lee eof, la variable EOF en in se programará con 1, e in.get() puede devolver 1.

Entonces, ¿por qué de acuerdo con el método de escritura in>>temp en el código proporcionado por el cartel, al final se generarán dos cs, que es diferente de la salida de get? Esto se debe a que >> durante el procesamiento, si se lee el carácter de fin de archivo, no se escribirá en la memoria caché. En ese caso, la cadena en la memoria caché seguirá siendo el carácter anterior a la lectura de eof (en este código. , es 'c'), y luego el valor asignado a temp sigue siendo 'c'.

¿Cómo podemos modificar el código anterior de forma más perfecta? Para el flujo de entrada del archivo, hay un puntero que apunta al siguiente bit de la cadena leída actualmente. Cada vez que se lee un bit, el puntero baja un bit. Por ejemplo, si hay un archivo input.txt que solo tiene abc, ahora que hemos terminado de leer c, el estado del puntero es aproximadamente el siguiente:

a

b

c

EOF <--

Tenga en cuenta que en este momento, in.eof() no ha devuelto 1 porque el flujo de entrada aún no ha leído el carácter de fin de archivo EOF. Pero tiene una función peek() que lee el símbolo en la posición señalada por el puntero actual. Entonces sería mejor si se utiliza in.peek() == EOF como criterio de juicio. El ejemplo del cartel está escrito como

while(in.peek() != EOF)

{

in>>temp

cout <

count++;

}

Eso es.

Por cierto, no es necesario incrustar un while dentro del while en el primer fragmento de código...

Además, ya sea leyendo o escribiendo, lo mejor es desarrollar Es un buen hábito llamar a close() para cerrar la transmisión una vez completada la operación :)