Herramientas de usuario

Herramientas del sitio


ejemplos_archivos
no way to compare when less than two revisions

Diferencias

Muestra las diferencias entre dos versiones de la página.


ejemplos_archivos [2015/06/15 14:52] (actual) – creado leandro
Línea 1: Línea 1:
 +==== 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"?
 +
 +[[http://info.nachodigital.com.ar/lib/exe/fetch.php?media=ejemplos_archivos.tar.gz|Link a los ejemplos]]
ejemplos_archivos.txt · Última modificación: 2015/06/15 14:52 por leandro