Ejemplos de acceso a archivos en C
Les dejo un par de ejemplos que realicé durante el fin de semana que demuestran un poco como laburar con archivos en el lenguaje, repasando lo que vimos la clase pasada del 13/6.
Printself
Este programa (printself.c) abre su propio archivo de código fuente, y lo imprime línea por línea por pantalla. Para esto utiliza un buffer como memoria intermedia, a la cual le asigné un tamaño de 512 bytes (por tomar un valor arbitrario). En cada ciclo del programa se comprueba con feof() si llegamos al final del archivo, y en caso de que esto sea falso, borramos el buffer con memset(), le cargamos una línea con fgets(), y la escribimos en stdout con fputs(). Al llegar al final del archivo, cerramos el descriptor de archivo con fclose() y salimos.
Un par de tips
Prueben correr el programa comentando algunas líneas. ¿Qué pasa si sacamos el memset()? ¿Por qué? Ayúdense con el man y un editor hexadecimal para saber qué ocurre (man 3 fgets).
Para recordar más simplemente los significados de los nombres de las funciones: fgets() significa: “FILE Get String”, es decir, “Leer una string de un FILE (nuestro descriptor de archivo)”. Más adelante veremos que hay otras formas de leer y escribir a archivos, que no utilizan este tipo de descriptor, y se denominan diferente.
De igual manera, fputs() significa “FILE Put String”, es decir, “Colocar un string en un FILE”.
Diario personal
Este otro ejemplo lee líneas de la terminal y las escribe a un archivo, al cual le va a agregando siempre la fecha y hora actuales, junto con los datos que lee. De esa manera crea una especie de “registro diario”, o “diario personal”. La fecha y hora la cargamos con time(), la “interpretamos” y convertimos a string con ctime(), y la imprimimos en el archivo con fputs(). Ya que tratamos a la entrada y salida de consola como un flujo de datos identificable con un descriptor de archivo, esto es totalmente transparente. Más adelante veremos que la filosofía UNIX de “todo es un archivo” es extremadamente práctica y transparente al usuario, ya que podemos tratar a todo como un simple flujo, por ejemplo un archivo, un puerto de la máquina, una conexión de red… hasta la placa de sonido.
Detalles y preguntas
¿Por qué imprimo los errores con fprintf() y por qué los escribo a stderr? ¿Qué pasaría si abro el archivo de salida con el modo “w”?