¿Qué significa “^@” en el archivo?

3 minutos de lectura

avatar de usuario
Ren

Código:

int fd;
fd = open("fruit", O_WRONLY);
write(fd, "apple", sizeof("apple"));
close(fd);

lo compilo con

$ gcc test.c -o test

y corre como

$ ./test   

Entonces abro el fruit archivo, y veo lo siguiente en el archivo:

apple^@

Lo que hace el ^@ ¿significar?

avatar de usuario
chiquitín

Es el código de carácter nulo. '\0'. Ciertos editores como vi mostrarlo como ^@.

sizeof("apple") devolvería 6 porque incluye el carácter nulo utilizado para terminar cadenas.

avatar de usuario
Tomas Dickey

los ^@ es la forma en que un ASCII NUL se representa comúnmente en forma imprimible. Eso es lo mismo que el @ carácter con algunos bits eliminados:

@ = 0100
^@ = 0

y es lo mismo que '\0' (el terminador de cadena en C). Debido a que es el terminador de cadena, no lo vería desde printf o sus funciones relacionadas, pero puede crearlo fácilmente usando el bloque orientado write. Por ejemplo, podrías haber escrito

write(fd,"apple\0orange",sizeof("apple\0orange"));

y visto

apple^@orange^@

porque cada el literal entre comillas dobles en C tiene un terminador de cadena final que se cuenta en su tamaño. Si hubiera tenido la intención de escribir la cadena sin su terminador, podría haber hecho esto:

const char *s = "apple";
write(fd,s,strlen(s));

eliminando así dos problemas en el ejemplo: (a) longitud incorrecta y (b) posiblemente usando contenido y longitud de cadena inconsistentes asegurándose de que ambos sean el mismo elemento. Ver Tamaño del literal de cadena para algunos comentarios sobre (a).

NUL es uno de los 32 caracteres de control ASCII cuyos valores van de 0 a 31, llamado controles C0. Todos estos caracteres de control ASCII normalmente se muestran de esta manera (para un formulario imprimible), utilizando el carácter correspondiente a la suma de 64 (0100) al valor del carácter de control.

ASCII DEL es 127 (0177). mostrándolo como ^? es un caso especial que es más reciente que los otros caracteres de control ASCII. Por ejemplo, X/Open terminfo (curses) no define una forma imprimible para este carácter, aunque sí lo hace para los demás. A diferencia de los otros caracteres de control ASCII, DEL se forma haciendo OR en todos los (siete) bits del carácter.

ASCII es un código de 7 bits, por supuesto. Se desarrollaron muchos otros códigos; ASCII corresponde al Juego de caracteres portátil POSIXpor lo que se encuentra con frecuencia.

Es fácil encontrar tablas de caracteres ASCII con una búsqueda web. La mayoría de estas tablas (o la discusión que las acompaña) se desvían hacia la desinformación. Aquí hay un enlace a una página razonablemente objetiva, titulada Conjunto de caracteres ASCII. Afirma

La tecla Control resta 64 del valor de las claves que modifica.

Sin embargo, la declaración solo es correcta si la clave es una de las del conjunto @, A, B, etc. Si aplica eso a otras teclas, los resultados quizás sean interesantes pero no útiles. Más bien, en un programa C haría un enmascaramiento lógico, por ejemplo,

ch = ch & 037;

para obtener un carácter en el rango de 0 a 31.

  • DEL también, que se puede mostrar como ^? (en este caso con el bit 0x40 borrado en lugar de establecido).

    – deltab

    17 de mayo de 2015 a las 7:01

  • Considere agregar “porque no hay definido formulario imprimible” al cuarto párrafo 🙂

    – Jongware

    17 mayo 2015 a las 10:30

  • Por cierto, Unicode sí definir caracteres de símbolo para caracteres de control: ␀ ␡ (Sin embargo, es posible que su navegador no los muestre).

    – Tom Blodget

    17 mayo 2015 a las 12:54


  • Mi navegador los muestra en su comentario, pero están en minúsculas y solo se pueden leer porque sé lo que pretendía.

    – Thomas Dickey

    17 mayo 2015 a las 13:02

¿Ha sido útil esta solución?