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 > outfileno implica Ctrl- D. Por cierto, se puede cambiar el carácter EOF terminal para algo más que Ctrl- Dmediante el sttycomando.
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 readllamada 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 catcomando: escriba algunos caracteres en la línea y presione Ctrl- D. Verá que los caracteres le devuelven el eco y catesperan 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 EOFpersonaje; 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, EOFse hace -1a propósito para indicar que no es un carácter válido. La E / S estándar regresa EOFcuando 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.
bashponer 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)