You are on page 1of 7

FICHEROS EN C/C++ Los datos introducidos en un array de estructuras estn disponibles slo mientras el programa est en ejecucin.

Al finalizar sta, si se ejecuta de nuevo, se tendr que volver a introducir otra vez los datos. Para que los datos permanezcan de una ejecucin a otra y puedan ser utilizados las veces que sean necesarias se almacenan en un fichero en disco, en lugar de en un array de memoria. CONCEPTOS BASICOS Campo: Conjunto de caracteres capaz de suministrar informacin referida a un concepto. Registro: Conjunto de campos referentes a una entidad particular. Fichero: Conjunto de registros almacenados en un soporte magntico que presentan entre s una relacin lgica y que pueden ser consultados individualmente de forma iterativa y sistemtica. Para trabajar con ficheros, C proporciona varias funciones de E/S que permiten leer y escribir datos a y desde ficheros y dispositivos. La caracterstica fundamental es que la E/S en el procesamiento de ficheros se realiza a travs de un buffer o memoria interna. C se refiere a estas funciones como streams de E/S. Un buffer es un rea de datos en la memoria asignada por el programa que abre el fichero. La utilizacin de buffers en operaciones de E/S reduce el nmero de accesos al dispositivo fsico asociado con el fichero necesarios para la transferencia de informacin entre el programa y el fichero. (Un acceso a un dispositivo fsico consume mucho ms tiempo que un acceso a la memoria RAM). Si el fichero no tiene asociado un buffer, cada byte escrito en o desde el fichero es fsicamente transferido en el momento de la operacin. En cambio, cuando un fichero tiene asociado un buffer, todas las operaciones de E/S requeridas son servidas desde ese buffer y la transferencia fsica de datos se hace en mltiplos de ese buffer. Una vez finalizado el trabajo con un fichero, ste debe cerrarse. (El nmero de ficheros abiertos al mismo tiempo est limitado). En C/C++ un fichero tiene organizacin secuencial y el acceso puede ser: secuencial aleatorio

Todas las funciones utilizadas para el tratamiento de ficheros estn en la librera: <stdio.h> OPERACIONES CON FICHEROS

Apertura de un fichero La funcin para abrir un fichero devuelve un puntero a una estructura de tipo FILE que define, entre otros datos, el buffer asociado con el fichero abierto. Si devuelve un puntero nulo indica error en la apertura. El puntero devuelto recibe el nombre de stream y es utilizado por las funciones estndar de E/S para leer y escribir datos en el fichero; detecta en cada momento en qu situacin nos encontramos en el fichero (al principio, en un registro determinado, mas all de la marca de fin de fichero, etc.). Antes de invocar a la funcin fopen hay que definir un puntero que apunte a una estructura de tipo FILE. El formato general de la funcin de apertura es: Nombre_puntero = fopen (Nombre_fsico_del_fichero,Modo_de_apertura); Ejemplo: # include <stdio.h> FILE *pf; (creacin del puntero tipo FILE) pf = fopen(datos,w); if (pf == NULL) o bien if(!pf) printf(Error en la apertura); Modo de apertura r : Fichero de texto. Solo de lectura. El fichero debe existir. r+ : Fichero de texto. De lectura y escritura. El fichero debe existir w : Fichero de texto. Solo de escritura. Si el fichero ya existe, se borra w+ : Fichero de texto. De escritura y lectura. Si el fichero ya existe, se borra a : Fichero de texto. Solo de escritura para aadir datos. Si no existe, se crea a+ : Fichero de texto. De escritura para aadir datos y de lectura. Si no existe, se crea Cierre de un fichero La funcin para cerrar un fichero es fclose. Si un fichero no se cierra explcitamente es cerrado automticamente al finalizar el programa. Sin embargo, es aconsejable cerrar un fichero cuando se ha finalizado el trabajo con l. Cualquier dato en el buffer asociado se escribe en el fichero antes de cerrarlo y coloca la marca de final de fichero en el soporte externo. Al cerrar un fichero se libera tambin el buffer asociado al mismo. El formato general de la funcin de cierre es:

fclose(nombre_del_puntero); Si la operacin de cierre se ejecuta satisfactoriamente, la funcin fclose devuelve un cero. Si ocurre un error entonces devuelve un EOF (valor distinto de cero).

Lectura de un archivo secuencial (mediante registros) Para recuperar la informacin de un archivo secuencial previamente creado, hay que abrirle en modo lectura. Despus hay que recorrer el archivo mientras no se alcance la marca de fin de fichero. Recorrer el fichero significa acceder y leer cada uno de sus registros. La funcin que se utiliza para leer un bloque de datos de un fichero es: fread(&registro, num_bytes, num_bloques, puntero); siendo: registro: variable donde se almacena en el buffer el bloque ledo num_bytes: nmero de bytes (tamao en bytes) del bloque num_bloques: nmero de bloques que se quiere leer en una sola operacin de lectura. puntero: puntero con el que se ha abierto el fichero Deteccin de la marca de Fin de fichero La funcin para detectar la marca de fin de fichero es: feof(puntero); Esta funcin devuelve un nmero: 0 si no es FF <> 0 si es FF Escritura de un fichero secuencial (mediante registros) Para crear un archivo debe abrirse en modo escritura. Si ya existe se pierde su informacin previa. Para grabar un bloque de datos en un fichero se utiliza la siguiente funcin: fwrite(&registro, num_bytes, num_bloques, puntero); Estos argumentos tienen el mismo significado que en la funcin de lectura. Deteccin de errores

La funcin ferror se utiliza para detectar los errores producidos en las operaciones que se hagan con un fichero. ferror(puntero); esta funcin devuelve: 0 <> 0 si no hay error si hay error

Cuando ocurre un error el indicador de error se activa y permanece activado hasta que se cierra el fichero o hasta que se desactiva mediante la funcin clearerr clearerr(puntero); Esta funcin desactiva el indicador de error y el indicador de fin de fichero (si est activado) y los pone a 0. Lectura/Escritura de datos sin utilizar registros 1. - E/S de cadenas de caracteres y de caracteres Los datos pueden ser ledos / escritos de/en un fichero como caracteres mediante las siguientes funciones: fputs Esta funcin copia la cadena de caracteres almacenada en la variable cadena. El carcter \0 con el que termina toda cadena, no se copia. Igual que puts escribe en pantalla una variable cadena hasta que encuentra el carcter \0, fputs tambin lo hace, pero sobre el fichero. Esto significa que escribir sobre el fichero cadenas de longitud variable segn el contenido de las mismas. Por ello, si se quiere escribir en el fichero cadenas de longitud fija, debemos rellenar con espacios dichas variables cadenas. El formato de esta funcin es: fputs( cadena _ caracteres, puntero); o fputs( variable_cadena, puntero);

fputc

Igual que la funcin anterior pero para copiar en el fichero un carcter o una variable carcter en la posicin indicada por el puntero de lectura/escritura. fputc(carcter, puntero); o

fputc(variable_carcter, puntero); fgets Esta funcin lee una cadena de caracteres del fichero apuntado por el puntero y la almacena en cadena. Se entiende por cadena de caracteres, la serie de caracteres que va desde la posicin actual dentro del fichero hasta: - el primer carcter \n incluido ste - el final de fichero - que el nmero de caracteres sea igual a n-1. La terminacin \0 es aadida automticamente a la cadena leda y el carcter \n (si lo hay) no es eliminado. Esta funcin devuelve un puntero al principio de la cadena leda. Si el valor devuelto es NULL quiere decir que ha ocurrido un error. El formato de esta funcin es: fgets(variable_cadena, Num, puntro); Num: nmero de caracteres que se desea leer del fichero. Los almacena en la variable _ cadena. Si antes de llegar a Num lee el carcter nulo finaliza la lectura. fgetc Igual que la funcin anterior pero para leer un carcter de la posicin indicada por el puntero de L/E y avanza la posicin al siguiente carcter a leer. fgetc(puntero); Al igual que la funcin getchar si se desea guardar el carcter ledo, se asignar a una variable. Por ejemplo: C=fgetc(punt);

2. - Lectura / escritura con formato (fscanf y fprintf)

fscanf Idntica a scanf pero pasndole como primer parmetro el puntero del fichero: fscanf(puntero,caracteres de control, argumentos);

fprintf Idntica a printf pero pasndole como primer parmetro el puntero del fichero: fprintf(puntero,caracteres de control, argumentos); Si el stream (puntero asociado al fichero) especificado en la funcin fprintf es stdout el resultado es el mismo que si hubiramos invocado a la funcin printf. Es decir, las sentencias siguientes son equivalentes: printf(n = %d\n, n); fprintf(stdout, n = %d\n, n); Esto demuestra que un dispositivo fsico recibe el mismo tratamiento que un fichero en el disco.

3. - E/S de un entero lectura de un entero getw(puntero); Ejemplo: Edad=getw(punt); escritura de un entero put(variable_entera, puntero); Ejemplo: putw(punt);

ACCESO ALEATORIO A UN FICHERO El acceso aleatorio permite acceder directamente al registro deseado del fichero sin necesidad de tener que acceder a los registros que le preceden. Esto se realiza con las siguientes funciones: fseek

Esta funcin mueve el puntero de lectura / escritura asociado con el fichero a una nueva localizacin desplazada desp bytes de la posicin dada por el argumento pos. El deslazamiento desp puede ser positivo o negativo. El prototipo de esta funcin es: int fseek(FILE *pf, long desp, int pos); es decir: fseek(puntero, desplazaminto, posicin); El argumento pos puede tomar alguno de los valores siguientes: Pos SEEK_SET SEEK_CUR SEEK_END Definicin Principio del fichero Posicin actual del puntero de L/E Final del fichero

La funcin fseek devuelve un 0 si no hubo error y un valor <>0 en caso contrario. ftell La funcin ftell da como resultado el tamao en bytes de la posicin actual del fichero apuntado por pf. Esta posicin es relativa al principio del fichero: long ftell (FILE *pf); Ejemplo: long pos; pos= ftell(pf); Calculo del nmero de registros(de longitud fija) de un fichero fseek(pf, 0L, SEEK_END); totalreg= ftell(pf) / bytesreg; // bytesreg tamao del registro

You might also like