2009-07-04 20 views
6

¿Existe una forma independiente de plataforma de escribir el símbolo EOF en una cadena en Ruby? En * nix creo que el símbolo es ^D, pero en Windows es ^Z, es por eso que pregunto.Forma de Ruby multiplataforma para escribir el símbolo EOF

+0

Solo por curiosidad, ¿por qué lo necesitas? –

+0

p. Tengo algunos archivos PDF que no pude convertir con "convertir" (ImageMagick) porque les falta el marcador EOF. Al mismo tiempo, esos archivos pueden ser vistos por una aplicación de escritorio. Me gustaría intentar agregar un marcador así y luego convertir los archivos PDF ... –

Respuesta

17

EOF no es un personaje, es un estado. Las terminales usan caracteres de control para representar este estado (C-d). No hay tal cosa como "leer un EOF carácter" y lo mismo para escribir uno. Si está escribiendo en un archivo, simplemente ciérrelo cuando haya terminado. Ver este mailing list post:

Parece que usted está pensando en EOF como en banda pero el carácter especial valor que marca el final del archivo. Es es mejor considerarlo como un valor centinela fuera de banda . En C, EOF es por lo general -1 y la API asociada especifica valores de retorno enteros tan que se garantiza que EOF nunca será confundido con un valor válido en banda.

Aquí hay alguna prueba más (hacer esto en Unix):

$ cat > file 
hello^V^Dworld 
^D 
$ cat file 
helloworld 

Typing^V^D inserta un carácter de control-D, literalmente, en el archivo. Después de tipear world e intro, el^D cierra el conducto. El archivo termina siendo 12 bytes de longitud 10 letras, dos más para^D y la línea nueva. La final^D no termina en el archivo. Simplemente es usado por la terminal/shell para cerrar la tubería.

+5

es una idea errónea muy común de que EOF es un personaje – GogaRieger

5

En general, no hay caracteres EOF. Es decir, no hay una solución multiplataforma para esto e incluso en plataformas específicas, el manejo de dicho personaje es puramente legado e inconsistente. Finaliza un archivo cerrándolo.

Sin embargo, para ser pedante, ciertos sistemas operativos cuando se leen archivos en ciertos modos admiten un carácter de final literal de archivo. Por ejemplo, si se está ejecutando en Windows y usa la API de C stdio para leer un archivo en modo texto, entonces un control literal Z (código de carácter 26) señalará el final del archivo a stdio. Esto es un remanente de MS-DOS que tiene como remanente de CP/M. Si usa stdio y lee el archivo en modo binario, entonces el control-Z no terminará el archivo.

Sin embargo, solo debe considerarlo como la función "conocer, no usar". Querrá saber si alguna vez veas entradas/salidas trucadas en Windows, pero usarlas es una locura.

Cuestiones relacionadas