Vous êtes sur la page 1sur 10
ssrntit1 Programacién en CiManejo de archivos - Wiklibros Programacién en C Manejo de archivos De Wikilibros, la coleccién de libros de texto de contenido libre. Programacién en C/Manejo de archivos Asi como hemos revisado la salida y entrada por pantalla y teclado respectivamente, veremos ahora la entrada ylo salida de datos utiizando ficheros, lo cual serd imprescindible para un gran nimero de aplicaciones que deseemos desarrollar. Contenido = 1 Ficheros = 1.1 fopen = 12 felose = 13 feof = 14 rewind = 2 Lectura = 2.1 fete 2.2 fgets 2.3 fread 2.4 icant = 3 Escritura = 3.1 fpute = 3.2 fputs = 3.3 fiwtite = 3.4 fprintt Ficheros Elestindar de C contiene fimciones varias para la edicién de ficheros, estas estén definidas en la cabecera stdio.h y por lo general empiezan con la letra f, haciendo referencia a file. Adicionalmente se agrega un tipo FILE, el cual se usar como apuntador a la informacién del fichero. La secuencia que usaremos para realizar operaciones sera la siguiente: * Crear un apuntador del tipo FILE * * Abrir el archivo utilizando la funcién fopen y asigndndole el resultado de la llamada a nuestro apuntador. = Hacer las diversas operaciones (lectura, escritura, etc). * Cerrar el archivo utilizando la fimcién felose. ssrntit1 Programacién en CiManejo de archivos - Wiklibros Esta fimcién sitve para abrir y crear ficheros en disco. El prototipo correspondiente de fopen es: FILE * fopen (const char *£filename, const char *opentypel Los parimetros de entrada de fopen son: filename: una cadena que contiene un nombre de fichero vilido. opentype: especitica el tipo de fichero que se abrird 0 se crear’, Una lista de parmetros opentype para la fimcién fopen son: = 'r": abrir un archivo para lectura, el fichero debe existr. = "w" :abrir un archivo para escritura, se crea sino existe o se sobreescribe si existe = a" abrir un archivo para escritura al final del contenido, sino existe se crea. = "r+" abrir un archivo para lectura y escritura, el fichero debe existir. = "wh": crear un archivo para lectura y escritura, se crea sino existe o se sobreescribe si existe. = "at" :abriv/erear un archivo para lectura y eseritura al final del contenido Adicionalmente hay tipos utilizando "b" (binary) los cuales no s Ios sistemas operativos que no pertenecen a la familia de unix. srin mostrados por ahora y que solo se usan en felose Esta fimcidn sirve para poder cerrar un fichero que se ha abierto. Elprototipo correspondiente de felose es int felose (FILE “stream; A Un valor de retorno cero indica que el fichero ha sido correctamente cerrado, si ha habido algun error, el valor de retomno es la constante EOF Un ejemplo pequefio para abrir y cerrar el archivo llamado fichero.in en modo leetura: t main(int arge, char** argv) FILE “fp; 7 fp = fopen ( "fichero.in"™, "r™ } 7 felose ( fp Como vemos, en el ejemplo se utiizé el opentype "s", que es para la kectura. tra cosa importante es que el lenguaje C no tiene dentro de siuna estructura para el manejo de excepciones 0 de ertores, por eso es necesario comprobar que el archivo fue abierto con éxito "if(archivo = NULL)". Si ssrntit1 Programacién en CiManejo de archivos - Wiklibros solo vamos a dar una salida con un retomo de 1 que sirve para sefialar que el programa termino por un error. feof Esta fimcién sitve para determinar si el cursor dentro del archivo encontré el final (end of file). Existe otra forma de verificar el final del archivo que es comparar el caracter que trae fgete del archivo con el macro EOF declarado dentro de stdio.h, pero este método no offece la misma seguridad (en especial al tratar con los archivos "binarios"), La fimcién feof siempre devolveri cero (Falso) sino es encontrado EOF en el archivo, de Jo contrario regresaré un valor distinto de cero (Verdadero). El prototipo correspondiente de feofes: feof (PILE *fichero); rewind Literalmente significa "'rebobinar”, sitia el cursor de lectura/escritura al principio del archivo, El prototipo correspondiente de rewind es: void rewind (FILE *fichero s) que esta guardado en el disco Lectura Unarchivo generalmente debe verse como un string (una cadena de caracter duro, Para trabajar con los archivos existen diferentes formas y diferentes fimneiones. Las fimciones que podriamos usar para leer un archivo son: = char fgete(FILE *archivo) = char *fgets(char *buffer, int tamano, FILE *archivo) = size_{ fiead(void *puntero, size_{ tamano, size_t cantidad, FILE *archivo); = int fcanf{FILE *fichero, const char * formato, argumento, Las primeras dos de estas fimciones son muy parecidas entre si, Pero la tercera, por el numero y el tipo de parimetros, nos podemos dar cuenta de que es muy diferente, por eso la trataremos aparte junto al fwrite que ¢s su contraparte para escritura fgete Esta fimcién lee un caracter a la vez del archivo que esta siendo seflalado con el puntero *arehivo. En caso de que la lectura sea exitosa devuelve el caracter leido y en caso de que no lo sea o de encontrar el final del archivo devuelve EOF. El prototipo correspondiente de fgete es: char fyete (FILE tarchivo) : Esta fimcién se usa generalmente para recorrer archivos de texto. A manera de ejemplo vamos a suponer que tenemos un archivo de texto llamado "prueba.txt" en el mismo directorio en que se encuentra el fuente de nuestro programa. Un pequefio programa que lea ese archivo sera: seit Programacién en CiManejo de archivos - Wiklioros nt main() FILE “archivo; har caracter; archive — fopen("prueba.txt", 3 (archivo == NULL) printf("\nError de apertura del archivo. \a\n"); printé("\nb1 ‘ive de prueba es \n\n le (feof (archivo) caracter printé(" fyete (archivo) ; o",caracter); fgets Esta fincién esta disefiada para leer cadenas de caracteres. Leerd hasta n-1 caracteres o hasta que lea un retomo de linea, En este titimo caso, el caricter de retomo de linea tambign es leido. Elprototipo correspondiente de fgets es: char *fyets (char “buffer, int tamaio, PILE ‘archivo); Elprimer parimetro buffer lo hemos llamado asi porque es un puntero a un espacio de memoria del tipo char (podriamos usar un arreglo de char). El segundo parimetro es tamatio que es el limite en cantidad de caracteres a leer para la funcion fgets. Y por uiimo el puntero del archivo por supuesto que es la forma en que fgets sabra a que archivo debe leer. finclude * dinclude fe] int main( FILE *archivo; har caracteres [100]; archivo = fopen("prueba.txt", (archivo == NULL) exit (1); printé("\nEl contenido del archivo de prueba es \n\n"); (feof (archivo) == 0) fgets (caracteres, 100, archivo); print£("$s" caracteres) ; ssrntit1 Programacién en CiManejo de archivos - Wiklibros Este es 1 mismo ejemplo de antes con la diferencia de que este hace uso de fgets en lugar de fgete. La funcién fgets se comporta de la siguiente manera, leerd del archivo apuntado por archivo los caracteres que encuentre ya ponerlos en buffer hasta que lea un caracter menos que la cantidad de caracteres especificada en tamatio o hasta que encuentre el final de una linea (\n) 0 hasta que encuentre el final del archivo (EOF). En este ejemplo no vamos a profindizar mas que para decir que caracteres es un buffer, los pormenores seran explicados en la seccién de manejo dinimico de memoria. Elbeneficio de esta fimeidn es que se puede obtener una linea completa a la vez. Y resulta muy itil para algunos fines como la construccién de un parser de algiin tipo de archivo de texto fread size_t fread ( void * ptr, size_t size, size_t count, FILE * stream); Esta fimciin lee un bloque de una "stream" de datos. Efectia la lectura de un arreglo de elementos "count", cada uno de los cuales tiene un tamaiio definido por "size", Luego los guarda en el bloque de memoria especificado por "ptr", El indicador de posicién de la cadena de caracteres avanza hasta leer la totalidad de bytes. Si esto es exitoso la cantidad de bytes leidos es (size* count, PARAMETROS: ptr : Puntero a un bloque de memoria con un tamafio minimo de (size*count) bytes. size : Tamafio en bytes de cada elemento (de los que voy a leer). count : Niimero de elementos, los cuales tienen un tamatio "size" stream: Puntero a objetos FILE, que especifica la cadena de entrada. fscanf La fimeién ficanf fimciona igual que s lugar del teclado, anf en cuanto a pardmetros, pero la entrada se toma de un fichero en El prototipo correspondiente de fseanf es: int fscanf (FILE *fichero, const char *formato, argumento, ...); : Podemos ver un ejemplo de su uso, abrimos el documento "fichero.txt" en modo lectura y leyendo dentro de el finch int main ( int arge, chaz “argv } FILE *fp; har buffer {100 fp = fopen ( ssrntit1 Programacién en CiManejo de archivos - Wiklibros Escritura Asicomo podemos leer datos desde un fichero, también se pueden crear y escribir ficheros con la informacién que deseamos almacenar, Para trabajar con los archivos existen diferentes formas y diferentes fimciones. Las fimciones que podriamos usar para escribir dentro de un archivo son: * int fjute(int caracter, FILE *archivo) * int fputs(const char *buffer, FILE *archivo) = size_t fivrite(void *puntero, size_t tamano, size_t cantidad, FILE *archivo); = int fprinti{FILE ‘archivo, const char *formato, argumento, ...); fpute Esta fincién escribe un cardcter a la vez del archivo que esta siendo sefialado con el puntero *archivo. El valor de retomo es el cardeter escrito, sila operacin fue completada con éxito, en caso contrario ser EOF. El prototipo correspondiente de fpute es: fpute(int caracter, FILE *archivo); a Mostramos un ejemplo del uso de fpute en un "“‘ichero.txt", se eseribira dentro del fichero hasta que presionemos la tecla enter, “argv } em, MEE exto al ficher ((caracter = getenar()) != '\n') fpute(caracter, fp)); fputs La fincién fputs escribe una cadena en un fichero. No se afiade el cardcter de retorno de linea ni el cardcter lfilHi ld t a i EOF d L oatdtd sein Programacin en CiManejo de archivos - Wikies Elprototipo correspondiente de fputs es: int fputs(const char “buffer, FILE *archivo) para ver su fincionamiento mostramos el siguiente ejemplo: #include B) main ( int arge, char **argv } FILE “fp; cadena[] = "Mostrando el uso de [puts en un Cichero.\n"; fp = fopen ( "fichero.txt", "Et" ); 5 fputs( cadena, fp ); felose ( fp); o; fwrite Esta fimcién esti pensada para trabajar con registros de longitud constante y forma pareja con fread. Es capaz de escribir hacia un fichero uno o varios registros de la misma longitud almacenados a partir de una direccién de memoria determinada. El valor de retomo es el nimero de registros escritos, no el nimero de bytes. Los paramettos son: un puntero a la zona de memoria de donde se obtendran los datos a escribir, el tamafio de cada registro, elnimero de registros a escribir y un puntero a la estructura FILE del fichero al que se hard la escritura, Elprototipo correspondiente de fwrite es: write ( id *puntero, size t tamano, size t cantidad, FILE *archive); 2 Un ejemplo conereto del uso de fwrite con su contraparte fread y usando funciones es: laa J * cheroCompleto.c * Copyright 2009 Julio César Brizuela y clude

Vous aimerez peut-être aussi