Sunteți pe pagina 1din 11

Universidad Fidlitas Chinchilla

______________________Prof. Lic. Esteban Marn

VIII. Generalidades funciones


8.1 Conceptos generales

sobre

archivos,

tipos

Muy a menudo necesitamos almacenar cierta cantidad de datos de forma ms o menos permanente. La memoria del ordenador es voltil, y lo que es peor, escasa y cara. De modo que cuando tenemos que guardar nuestros datos durante cierto tiempo tenemos que recurrir a sistemas de almacenamiento ms econmicos, aunque sea a costa de que sean ms lentos. Durante la historia de los ordenadores se han usado varios mtodos distintos para el almacenamiento de datos. Al principio se recurri a cintas de papel perforadas, despus a tarjetas perforadas. A continuacin se pas al soporte magntico, empezando por grandes rollos de cintas magnticas abiertas. Hasta aqu, todos los sistemas de almacenamiento externo eran secuenciales, es decir, no permitan acceder al punto exacto donde se guardaba la informacin sin antes haber partido desde el principio y sin haber ledo toda la informacin, hasta el punto donde se encontraba la que estbamos buscando. Con las cintas magnticas empez lo que con el tiempo sera el acceso aleatorio a los datos. Se poda reservar parte de la cinta para guardar cierta informacin sobre la situacin de los datos, y aadir ciertas marcas que hicieran ms sencillo localizarla. Pero no fue hasta la aparicin de los discos magnticos cuando sta tcnica lleg a su sentido ms amplio. En los discos es ms sencillo acceder a cualquier punto de la superficie en poco tiempo, ya que se accede al punto de lectura y escritura usando dos coordenadas fsicas. Por una parte la cabeza de lectura/escritura se puede mover en el sentido del radio del disco, y por otra el disco gira permanentemente, con lo que cualquier punto del disco pasa por la cabeza en un tiempo relativamente corto. Esto no pasa con las cintas, donde slo hay una coordenada fsica. Con la invencin y proliferacin de los discos se desarrollaron los ficheros de acceso aleatorio, que permiten acceder a cualquier dato almacenado en un fichero en relativamente poco tiempo. Actualmente, los discos duros tienen una enorme capacidad y son muy rpidos, aunque an siguen siendo lentos, en comparacin con las memorias RAM. El caso de los CD es algo intermedio. En realidad son secuenciales en cuanto al modo de guardar los datos, cada disco slo tiene una pista de datos grabada en espiral. Sin embargo, este sistema, combinado con algo de memoria RAM, proporciona un acceso muy prximo al de los discos duros. 8.2 Clasificacin de los archivos En cuanto al tipo de acceso, en C y C++ podemos clasificar los archivos segn varias categoras:

_______________________________________________________________________________________________ Estructura de Archivos 1

Universidad Fidlitas Chinchilla

______________________Prof. Lic. Esteban Marn

1.

2.

3.

4.

Dependiendo de la direccin del flujo de datos: o De entrada: Los datos se leen por el programa desde el archivo. o De salida: Los datos se escriben por el programa hacia el archivo. o De entrada/salida: Los datos pueden se escritos o ledos. Dependiendo del tipo de valores permitidos a cada byte: o De texto: Slo estn permitidos ciertos rangos de valores para cada byte. Algunos bytes tienen un significado especial, por ejemplo, el valor hexadecimal 0x1A marca el fin de fichero. Si abrimos un archivo en modo texto, no ser posible leer ms all de un byte con ese valor, aunque el fichero sea ms largo. o Binarios: Estn permitidos todos lo valores para cada byte. En estos archivos el final del fichero se detecta de otro modo, dependiendo del soporte y del sistema operativo. La mayora de las veces se hace guardando la longitud del fichero. Cuando queramos almacenar valores enteros, o en coma flotante, o imgenes, etc, deberemos usar este tipo de archivos. Segn el tipo de acceso: o Archivos secuenciales: Imitan el modo de acceso de los antiguos ficheros secuenciales almacenados en cintas magnticas. o Archivos de acceso aleatorio: Permiten acceder a cualquier punto de ellos para realizar lecturas y/o escrituras. Segn la longitud de registro: o Longitud variable: En realidad, en este tipo de archivos no tiene sentido hablar de longitud de registro, podemos considerar cada byte como un registro. Tambin puede suceder que nuestra aplicacin conozca el tipo y longitud de cada dato almacenado en el archivo, y lea o escriba los bytes necesarios en cada ocasin. Otro caso es cuando se usa una marca para el final de registro, por ejemplo, en ficheros de texto se usa el carcter de retorno de lnea para eso. En estos casos cada registro es de longitud diferente. o Longitud constante: en estos archivos los datos se almacenan en forma de registro de tamao constante. En C usaremos estructuras para definir los registros. C dispone de funciones de librera adecuadas para manejar este tipo de ficheros. o Mixtos: En ocasiones pueden crearse archivos que combinen los dos tipos de registros, por ejemplo, Foxpro usa registros de longitud constante, pero aade un registro especial de cabecera al principio para definir, entre otras cosas, el tamao y el tipo de los registros.

Es posible crear archivos combinando cada una de estas categoras, por ejemplo: archivos secuenciales de texto de longitud de registro variable, que son los tpicos archivos de texto. Archivos de acceso aleatorio binarios de longitud de registro constante, normalmente usados en bases de datos. Y tambin cualquier combinacin menos corriente, como archivos secuenciales binarios de longitud de registro constante, etc. En cuanto a cmo se definen estas propiedades, hay dos casos. Si son binarios o de texto o de entrada, salida o entrada/salida, se define al abrir el fichero, mediante la funcin fopen en C o mediante el mtodo open de fstream en C++. La funcin open usa dos parmetros. El primero es el nombre del fichero que contiene el archivo. El segundo es el modo que es una cadena que indica el modo en que se
_______________________________________________________________________________________________ Estructura de Archivos 2

Universidad Fidlitas Chinchilla

______________________Prof. Lic. Esteban Marn

abrir el archivo: lectura o escritura, y el tipo de datos que contiene: de texto o binarios. En C, los ficheros admiten seis modos en cuanto a la direccin del flujo de datos:

r: Slo lectura. El fichero debe existir. w: Se abre para escritura, se crea un fichero nuevo o se sobrescribe si ya existe. a: Aadir, se abre para escritura, el cursor se sita al final del fichero. Si el fichero no existe, se crea. r+: Lectura y escritura. El fichero debe existir. w+: Lectura y escritura, se crea un fichero nuevo o se sobrescribe si ya existe. a+: Aadir, lectura y escritura, el cursor se sita al final del fichero. Si el fichero no existe, se crea. En cuanto a los valores permitidos para los bytes, se puede aadir otro carcter a la cadena de modo:

t: modo texto. Normalmente es el modo por defecto. Se suele omitir. b: modo binario.

En ciertos sistemas operativos no existe esta distincin, y todos los ficheros son binarios. En C++ es algo diferente, el constructor de las clases ifstream, ofstream y fstream admite los parmetros para abrir el fichero directamente, y tambin disponemos del mtodo open, para poder crear el stream sin asociarlo con un fichero concreto y hacer esa asociacin ms tarde. 8.3 Tipos y funciones usadas frecuentemente con ficheros Tipo FILE C define la estructura de datos FILE en el fichero de cabecera <stdio.h> para el manejo de ficheros. Nosotros siempre usaremos punteros a estas estructuras. La definicin de sta estructura depende del compilador, pero en general mantienen un campo con la posicin actual de lectura/escritura, un buffer para mejorar las prestaciones de acceso al fichero y algunos campos para uso interno. Funcin fopen Sintaxis: FILE *fopen(char *nombre, char *modo); sta funcin sirve para abrir y crear ficheros en disco. El valor de retorno es un puntero a una estructura FILE. Los parmetros de entrada son:

_______________________________________________________________________________________________ Estructura de Archivos 3

Universidad Fidlitas Chinchilla

______________________Prof. Lic. Esteban Marn

1. nombre: una cadena que contiene un nombre de fichero vlido, esto depende del sistema operativo que estemos usando. El nombre puede incluir el camino completo. 2. modo: especifica en tipo de fichero que se abrir o se crear y el tipo de datos que puede contener, de texto o binarios:

r: slo lectura. El fichero debe existir. w: se abre para escritura, se crea un fichero nuevo o se sobreescribe si ya existe. o a: aadir, se abre para escritura, el cursor se situa al final del fichero. Si el fichero no existe, se crea. o r+: lectura y escritura. El fichero debe existir. o w+: lectura y escritura, se crea un fichero nuevo o se sobreescribe si ya existe. o a+: aadir, lectura y escritura, el cursor se situa al final del fichero. Si el fichero no existe, se crea. o t: tipo texto, si no se especifica "t" ni "b", se asume por defecto que es "t" o b: tipo binario.
o o

Funcin fclose Sintaxis: int fclose(FILE *fichero); Es importante cerrar los ficheros abiertos antes de abandonar la aplicacin. Esta funcin sirve para eso. Cerrar un fichero almacena los datos que an estn en el buffer de memoria, y actualiza algunos datos de la cabecera del fichero que mantiene el sistema operativo. Adems permite que otros programas puedan abrir el fichero para su uso. Muy a menudo, los ficheros no pueden ser compartidos por varios programas. Un valor de retorno cero indica que el fichero ha sido correctamente cerrado, si ha habido algn error, el valor de retorno es la constante EOF. El parmetro es un puntero a la estructura FILE del fichero que queremos cerrar. Funcin fgetc Sintaxis: int fgetc(FILE *fichero); Esta funcin lee un carcter desde un fichero. El valor de retorno es el carcter ledo como un unsigned char convertido a int. Si no hay ningn carcter disponible, el valor de retorno es EOF. El parmetro es un puntero a una estructura FILE del fichero del que se har la lectura. Funcin fputc
_______________________________________________________________________________________________ Estructura de Archivos 4

Universidad Fidlitas Chinchilla

______________________Prof. Lic. Esteban Marn

Sintaxis: int fputc(int caracter, FILE *fichero); Esta funcin escribe un carcter a un fichero. El valor de retorno es el carcter escrito, si la operacin fue completada con xito, en caso contrario ser EOF. Los parmetros de entrada son el carcter a escribir, convertido a int y un puntero a una estructura FILE del fichero en el que se har la escritura. Funcin feof Sintaxis: int feof(FILE *fichero); Esta funcin sirve para comprobar si se ha alcanzado el final del fichero. Muy frecuentemente deberemos trabajar con todos los valores almacenados en un archivo de forma secuencial, la forma que suelen tener los bucles para leer todos los datos de un archivo es permanecer leyendo mientras no se detecte el fin de fichero. Esta funcin suele usarse como prueba para verificar si se ha alcanzado o no ese punto. El valor de retorno es distinto de cero slo si no se ha alcanzado el fin de fichero. El parmetro es un puntero a la estructura FILE del fichero que queremos verificar. Funcin rewind Sintaxis: void rewind(FILE *fichero) Es una funcin heredada de los tiempos de las cintas magnticas. Literalmente significa "rebobinar", y hace referencia a que para volver al principio de un archivo almacenado en cinta, haba que rebobinarla. Eso es lo que hace sta funcin, sita el cursor de lectura/escritura al principio del archivo. El parmetro es un puntero a la estructura FILE del fichero que queremos rebobinar. Ejemplos: // ejemplo8.c: Muestra un fichero dos veces. #include <stdio.h> int main() { FILE *fichero; fichero = fopen("ejemplo8.c", "r"); while(!feof(fichero)) fputc(fgetc(fichero), stdout); rewind(fichero); while(!feof(fichero)) fputc(fgetc(fichero), stdout);
_______________________________________________________________________________________________ Estructura de Archivos 5

Universidad Fidlitas Chinchilla

______________________Prof. Lic. Esteban Marn

fclose(fichero); getchar(); return 0; }

Funcin fgets Sintaxis: char *fgets(char *cadena, int n, FILE *fichero); Esta funcin est diseada para leer cadenas de caracteres. Leer hasta n-1 caracteres o hasta que lea un retorno de lnea. En este ltimo caso, el carcter de retorno de lnea tambin es ledo. El parmetro n nos permite limitar la lectura para evitar derbordar el espacio disponible en la cadena. El valor de retorno es un puntero a la cadena leda, si se ley con xito, y es NULL si se detecta el final del fichero o si hay un error. Los parmetros son: la cadena a leer, el nmero de caracteres mximo a leer y un puntero a una estructura FILE del fichero del que se leer. Funcin fputs Sintaxis: int fputs(const char *cadena, FILE *stream); La funcin fputs escribe una cadena en un fichero. No se aade el carcter de retorno de lnea ni el carcter nulo final. El valor de retorno es un nmero no negativo o EOF en caso de error. Los parmetros de entrada son la cadena a escribir y un puntero a la estructura FILE del fichero donde se realizar la escritura. Funcin fread Sintaxis: size_t fread(void *puntero, size_t tamao, size_t nregistros, FILE *fichero); Esta funcin est pensada para trabajar con registros de longitud constante. Es capaz de leer desde un fichero uno o varios registros de la misma longitud y a partir de una direccin de memoria determinada. El usuario es responsable de asegurarse de que hay espacio suficiente para contener la informacin leda. El valor de retorno es el nmero de registros ledos, no el nmero de bytes. Los parmetros son: un puntero a la zona de memoria donde se almacenarn los datos
_______________________________________________________________________________________________ Estructura de Archivos 6

Universidad Fidlitas Chinchilla

______________________Prof. Lic. Esteban Marn

ledos, el tamao de cada registro, el nmero de registros a leer y un puntero a la estructura FILE del fichero del que se har la lectura. Funcin fwrite Sintaxis: size_t fwrite(void *puntero, size_t tamao, size_t nregistros, FILE *fichero); Esta funcin tambin est 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 direccin de memoria determinada. El valor de retorno es el nmero de registros escritos, no el nmero de bytes. Los parmetros son: un puntero a la zona de memoria donde se almacenarn los datos ledos, el tamao de cada registro, el nmero de registros a leer y un puntero a la estructura FILE del fichero del que se har la lectura. Funcin fprintf Sintaxis: int fprintf(FILE *fichero, const char *formato, ...); La funcin fprintf funciona igual que printf en cuanto a parmetros, pero la salida se dirige a un fichero en lugar de a la pantalla. Funcin fscanf Sintaxis: int fscanf(FILE *fichero, const char *formato, ...); La funcin fscanf funciona igual que scanf en cuanto a parmetros, pero la entrada se toma de un fichero en lugar del teclado. Funcin fflush Sintaxis: int fflush(FILE *fichero); Esta funcin fuerza la salida de los datos acumulados en el buffer de salida del fichero. Para mejorar las prestaciones del manejo de ficheros se utilizan buffers, almacenes temporales de datos en memoria, las operaciones de salida se hacen a travs del buffer, y slo cuando el buffer se llena se realiza la escritura en el disco y se vaca el buffer. En ocasiones nos hace falta vaciar ese buffer de un modo manual, para eso sirve sta funcin. El valor de retorno es cero si la funcin se ejecut con xito, y EOF si hubo algn error. El parmetro de entrada es un puntero a la estructura FILE del fichero del que se quiere vaciar el buffer. Si es NULL se har el vaciado de todos los ficheros abiertos.
_______________________________________________________________________________________________ Estructura de Archivos 7

Universidad Fidlitas Chinchilla

______________________Prof. Lic. Esteban Marn

8.4 Operaciones bsicas con archivos de acceso aleatorio


#include <stdio.h> #include <conio.h> #include <string.h> struct { int matricula; char nombre[30]; int edad; } alumno; void menu(); void crear(); void agregar(); void editar(); void consultar(); void eliminar(); main() { clrscr(); menu(); return 0; }

void menu() { int opc; clrscr(); printf ("MENU PRINCIPAL\n"); printf ("\n"); printf ("1. Crear archivo\n"); printf ("2. Agregar registro\n"); printf ("3. Editar registro\n"); printf ("4. Eliminar registro\n"); printf ("5. Buscar registro\n"); printf ("6. Salir del sistema\n"); printf ("Digite su opcin:"); scanf ("%d",&opc); switch (opc) {
_______________________________________________________________________________________________ Estructura de Archivos 8

Universidad Fidlitas Chinchilla

______________________Prof. Lic. Esteban Marn

case 1: { crear(); menu(); break; } case 2: { agregar(); menu(); break; } case 3: { editar(); menu(); break; } case 4: { eliminar(); menu(); break; } case 5: { consultar(); menu(); break; } case 6: { break; } } }

void crear() { clrscr(); FILE *memoria; memoria = fopen("p:\\alumnos.dat","w"); fclose(memoria); printf("Archivo creado"); getch(); } void agregar() { clrscr(); printf("Digite matricula :"); scanf("%d",&alumno.matricula); printf("Digite nombre :"); scanf("%s",&alumno.nombre); printf("Digite edad :"); scanf("%d",&alumno.edad); FILE *memoria;
_______________________________________________________________________________________________ Estructura de Archivos 9

Universidad Fidlitas Chinchilla

______________________Prof. Lic. Esteban Marn

memoria = fopen("p:\\alumnos.dat","at+"); fwrite(&alumno,sizeof(alumno),1,memoria); printf("Registro agregado"); getch(); fclose(memoria); } void editar() { clrscr(); printf("Digite matricula editar:"); int clave; scanf("%d",&clave); FILE *memoria; FILE *memoria2; memoria = fopen("p:\\alumnos.dat","r+"); memoria2 = fopen("p:\\temporal.dat","at+"); /*fread() regresa siempre cuantas estructuras leyo*/ while(fread(&alumno,sizeof(alumno),1,memoria)==1) { if ( clave == alumno.matricula) { printf("Digite nuevo nombre :"); scanf("%s",alumno.nombre); printf("Digite nueva edad :"); scanf("%d",&alumno.edad); fwrite(&alumno,sizeof(alumno),1,memoria2); } else { fwrite(&alumno,sizeof(alumno),1,memoria2); } }; /*fin del while*/ /*cerrado de archivos*/ fclose(memoria); fclose(memoria2); /*removiendo y renombrando archivos*/ remove("p:\\alumnos.dat"); rename("p:\\temporal.dat","p:\\alumnos.dat"); printf("Registro editado"); getch(); } void consultar() { int edad; clrscr(); printf("Digite la edad a buscar:"); scanf("%d",&edad); /*abriendo, leyendo,cargando estructura*/ FILE *memoria; memoria = fopen("p:\\alumnos.dat","at+"); /*Se inicia el ciclo de lectura y fread() regresa siempre cuantas estructuras leyo*/ while(fread(&alumno,sizeof(alumno),1,memoria)==1) { if (alumno.edad >= edad) { printf("El Id. del alumno es:%d\n",alumno.matricula);
_______________________________________________________________________________________________ Estructura de Archivos 10

Universidad Fidlitas Chinchilla

______________________Prof. Lic. Esteban Marn

printf("Su nombre es:%s\n",alumno.nombre); printf("Tiene %d aos\n",alumno.edad); printf("\n"); } } // aqui termina while getch(); fclose(memoria); } void eliminar() { int clave; clrscr(); printf("Digite matricula eliminar:"); scanf("%d",&clave); FILE *memoria; FILE *memoria2; memoria = fopen("p:\\alumnos.dat","r+"); memoria2 = fopen("p:\\temporal.dat","at+"); while(fread(&alumno,sizeof(alumno),1,memoria)==1) { if ( clave != alumno.matricula) fwrite(&alumno,sizeof(alumno),1,memoria2); } fclose(memoria); fclose(memoria2); /*removiendo y renombrando archivos*/ remove("p:\\alumnos.dat "); rename("p:\\temporal.dat","p:\\alumnos.dat "); printf("Registro eliminado"); getch(); }

_______________________________________________________________________________________________ Estructura de Archivos 11

S-ar putea să vă placă și