Acabo de leer las respuestas a "Eliminar un carácter de nueva línea al final de un archivo" y todos dijeron que eliminaran el último carácter. Mi pregunta es, ¿no es el personaje eof el último?
Acabo de leer las respuestas a "Eliminar un carácter de nueva línea al final de un archivo" y todos dijeron que eliminaran el último carácter. Mi pregunta es, ¿no es el personaje eof el último?
Respuestas:
Un archivo no termina con un carácter de Fin de archivo, ya que las respuestas anteriores indican correctamente. Pero creo que las respuestas y comentarios contienen algunas imprecisiones que vale la pena señalar:
El juego de caracteres ASCII no contiene un carácter EOF exacto. Hay varios caracteres de control de "fin": Fin del texto (3), Fin de la transmisión (4), Fin del bloque de transmisión (23), Fin del medio (25). El separador de archivos (28) puede acercarse más a un personaje EOF El código 26 es "Sustituto", no EOF.
Ctrl- Dsolo está asociado con la entrada del terminal. Por ejemplo, el comando
cat filea fileb filec > outfile
no implica Ctrl- D. Por cierto, se puede cambiar el carácter EOF terminal para algo más que Ctrl- Dmediante el stty
comando.
Estrictamente hablando, Ctrl- D(o lo que sea que hayas cambiado) no es un código clave EOF. Lo que hace es hacer que la read
llamada del sistema regrese con la entrada disponible, al igual que presionar la tecla de retorno hace que la llamada del sistema de lectura devuelva una línea de caracteres a la persona que llama. Por convención, un valor de retorno de cero de la llamada al sistema de lectura (es decir, lectura de cero caracteres) señala una condición de fin de archivo. Sin embargo, el archivo de entrada no se cierra automáticamente y, si la entrada proviene del terminal, no se coloca en el estado "fin de archivo". Puede escribir un programa que continúe leyendo desde el terminal incluso después de un "fin de archivo" y la llamada de lectura puede devolver un valor distinto de cero para la siguiente línea de entrada.
La analogía entre los personajes y eof EOL se puede ver si Ctrl- Dse pulsa cuando alguna entrada ya se ha escrito en la línea. Por ejemplo, si escribe "abc" y presiona Ctrl: Dla llamada de lectura regresa, esta vez con un valor de retorno de 3 y con "abc" almacenado en el búfer pasado como argumento. Dado que la lectura no devuelve 0, la convención anterior no interpreta esto como una condición EOF. De manera similar, al presionar regresar a hace que la llamada de lectura regrese con toda la línea de entrada (incluida la nueva línea). Puede probar esto con el cat
comando: escriba algunos caracteres en la línea y presione Ctrl- D. Verá que los caracteres le devuelven el eco y cat
esperan más información.
Todo lo anterior solo se aplica cuando el terminal está en modo "cocido", en oposición al modo "sin procesar", en el cual el procesamiento de entrada de línea se minimiza. En modo sin procesar, un carácter Ctrl-D realmente se entrega al búfer de entrada.
Los caracteres de control ASCII tienen definiciones de la década de 1960 (en realidad, preceden a lo que podría considerarse una red ). No todos esos caracteres de control se utilizan de la manera en que se definieron para equipos de telecomunicaciones en ese entonces.
En sistemas tipo Unix, no hay necesidad de un EOF
personaje; ninguno es usado. El sistema puede decirle a las aplicaciones cuántos bytes hay en un archivo:
En algunos otros sistemas (vistos en VMS, DOS, Windows), un control-Z puede actuar como un marcador de fin de archivo porque en versiones anteriores el sistema no podía decirle a algunas aplicaciones cuántos bytes hay en el archivo.
En el caso de VMS, la limitación se debió a la forma en que funcionaba el tiempo de ejecución de C. Las aplicaciones en lenguaje ensamblador podrían (y obtuvieron) el tamaño de archivo correcto.
Los sistemas Unix en el shell usan convencionalmente control-D para decirle a una aplicación que se ha alcanzado un final de entrada (archivo), pero el control-D no se almacena en el archivo.
En C, EOF
se hace -1
a propósito para indicar que no es un carácter válido. La E / S estándar regresa EOF
cuando se detecta una condición de fin de archivo, no un carácter especial.
Por cierto, los archivos no necesitan terminar con un carácter de nueva línea (avance de línea ASCII). Los editores de texto pueden hacer frente a archivos que son todos texto imprimible pero carecen de una nueva línea final.
busybox
's vi
, etc.).
EOF no es un personaje. Es un estado que indica que no hay más caracteres para leer de una secuencia de archivos. Cuando ingresa el comando EOF desde el terminal, está indicando al sistema operativo que cierre la secuencia de entrada, sin poner un carácter especial.
bash
poner las manos en la entrada, el controlador TTY lo masajea. Este controlador intercepta Ctrl-D y envía un EOF a bash
(donde EOF no es un personaje, sino un estado de archivo especial)