Acerca del carácter de final del archivo

  

(1) Cómo juzgar el final del archivo La mayoría de la gente piensa que hay un EOF en el archivo para indicar el final del archivo. Pero esta vista es realmente incorrecta, no hay nada en los datos contenidos en el archivo. Fin del archivo. Para getc, si no puede leerse desde el archivo, devuelve un entero -1, que se llama EOF. Devolver EOF no es más que dos casos, uno es que el archivo ha sido leído, el segundo es el archivo Error de lectura, ya no se puede leer.

(2) ¿Por qué necesita feof? ARCHIVO * fp; fp apunta a una estructura de datos muy complicada, se utiliza feof para determinar si el archivo está completado por el indicador en esta estructura Si el archivo se lee con fgetc, el indicador EOF en fp no se abrirá cuando se lea el último carácter. En este caso, al utilizar feof se llegará a la conclusión de que el archivo no se ha completado.

fgetc Volver -1, todavía no podemos estar seguros de que el archivo haya finalizado, ya que puede ser un error de lectura. En este momento necesitamos feof y feror.

(3) Acerca de Ctrl + D

getchar () El valor de retorno es normalmente un carácter, pero también puede ser un valor negativo, que devuelve EOF.

El punto a destacar aquí es que la función getchar generalmente devuelve los caracteres ingresados ​​por el terminal. Los valores ASCII correspondientes en estos sistemas de caracteres no son negativos. Por lo tanto, muchas veces, escribiremos dos líneas de código como esta: char c; c = getchar ();

Es probable que esto cause problemas. Debido a que la función getchar devuelve el EOF cuando encuentra Ctrl + D (Linux) o el EOF de fin de archivo, el getchar () devuelve EOF, que generalmente se define como -1 en la biblioteca de funciones. Por lo tanto, en este caso, la función getchar devuelve un valor negativo, y la asignación de un valor negativo a una variable char es incorrecta. Para que la variable definida contenga todos los valores posibles devueltos por la función getchar, la definición correcta es la siguiente (este problema se menciona específicamente en K &RC): int c; c = getchar ();

Segundo, los dos puntos del resumen de EOF (principalmente se refiere al EOF en el terminal ordinario) 1. EOF como final del archivo:

EOF es el final del archivo, pero en ningún caso ingrese Ctrl + D ( Windows
Ctrl + Z) puede alcanzar el final de la función de archivo, solo como el final del archivo en las siguientes condiciones.
(1) Cuando se ejecuta la función getcahr, cuando ingresa el primer carácter, puede ingresar directamente Ctrl + D, puede saltar de getchar () para ejecutar otras partes del programa; (2) cuando el carácter ingresado anteriormente es un carácter de nueva línea Luego, escriba Ctrl + D; (3) Cuando hay una entrada de caracteres al frente y no es un carácter de nueva línea, debe ingresar Ctrl + D dos veces, luego la segunda entrada de Ctrl + D funciona como el final del archivo. En cuanto a la primera función Ctrl + D se presentará a continuación. De hecho, los tres casos se pueden resumir en que solo cuando getchar () solicita una nueva entrada, escribir Ctrl + D directamente es equivalente al final del archivo.

2. Cuando EOF se usa como terminador de línea, al escribir Ctrl + D no termina getchar (), sino que solo getchar () muestra la siguiente ronda de entrada.

Esta situación es principalmente cuando crea una nueva línea de entrada para getchar (). Cuando ingresa un número de caracteres (no puede contener una nueva línea), puede ingresar Ctrl + D directamente. En este momento, Ctrl + D no es un archivo. El terminador, pero solo el equivalente de un carácter de nueva línea, finaliza la entrada actual. Tome el segmento de código anterior como ejemplo. Si ingresa abc y luego Ctrl + D durante la ejecución, la salida del programa es: abcabc

Nota: El primer grupo de abc se ingresa desde el terminal, luego ingrese Ctrl + D. Se emite el segundo conjunto de abc, y el cursor se detiene detrás de la c del segundo conjunto de caracteres, y luego se puede hacer una nueva entrada. En este momento, si ingresa Ctrl + D nuevamente, jugará el papel del carácter de final del archivo y finalizará con getchar (). Si ingresa abc, luego ingrese, ingrese una nueva línea, entonces el terminal muestra: abc //primera línea, con un carro abc //segunda línea //tercera línea

donde aparece el primer comportamiento Las entradas de terminal, la segunda actúa como salida de terminal, y el cursor se detiene en la tercera línea, esperando una nueva entrada de terminal. Desde aquí también puede ver los diferentes resultados de la salida cuando Ctrl + D y nueva línea se utilizan como finales de línea respectivamente. La función de EOF también se puede resumir de la siguiente manera: cuando el terminal tiene una entrada de caracteres, la EOF generada por Ctrl + D es equivalente a finalizar la entrada de la línea, lo que provocará una nueva ronda de entrada en getchar (); () Al leer una entrada nueva, ingrese Ctrl + D. El EOF generado en este momento es equivalente al final del archivo, y el programa finalizará la ejecución de getchar (). [Suplemento] La parte de resumen de EOF en la segunda parte de este documento se aplica al controlador de terminal en modo de una línea. Es decir, aunque getchar () y putchar () de hecho se realizan un carácter a la vez. Sin embargo, el controlador del terminal se encuentra en modo de una línea, y su entrada solo finaliza cuando está en " \\ n " o EOF. Por lo tanto, la salida obtenida en el terminal también está en la línea. Si desea alcanzar el final del terminal para leer un personaje, el siguiente programa es un método de implementación (consulte "Programación experta en C", ligeramente modificada) /* Edit by GodbachCU Blog: http://blog.chinaunix.net/u /33048 /* /# include < stdio.h > # include < stdlib.h >

intmain (void) {int c; /* El controlador del terminal está en modo de una línea normal * /system (" Stty raw ");

/* El controlador de terminal actual está en modo de un carácter a la vez * /c = getchar (); putchar ();

/* El controlador de terminal regresa a la línea una línea a la vez. Modo * /sistema (" sttycook ");

return 0;}

Compile y ejecute el programa, cuando se ingresa un carácter, el carácter se usa directamente y el programa finaliza. Se puede ver que debido a los diferentes modos del controlador del terminal, las condiciones para el final de la entrada getchar () son diferentes. En el modo normal, se requiere un retorno de carro o EOF, y en el modo de un solo carácter, se ingresa un carácter y el juego termina.

Copyright © Conocimiento de Windows All Rights Reserved