Archivos de Acceso Aleatoriogalia.fc.uaslp.mx/~rmariela/programacion/unidad62.pdf · 2012-02-25 ·...

Post on 28-Jul-2020

4 views 0 download

Transcript of Archivos de Acceso Aleatoriogalia.fc.uaslp.mx/~rmariela/programacion/unidad62.pdf · 2012-02-25 ·...

Archivos de Acceso Aleatorio� Los archivos binarios pueden accederse de forma

aleatoria. Es decir, puedo leer el primer elemento del archivo y posteriormente el 5º elemento o el ultimo elemento del archivo

� Esta forma de acceso se logra porque se guarda la información en bloques, por lo cual puedo acceder a cualquiera de los bloques que he almacenado.

� Para realizar estas acciones haremos uso de las funciones fwrite, fread, ftell, sizeof, fseek,rewind

fwrite� La función fwrite escribe un bloque de memoria al

archivo. Su sintaxis es la siguiente

fwrite(apunt_Ele, Tamaño_Ele, No_Elementos, apuntador_archivo)

� Ejemplo:#include <stdio.h>int main () { FILE * pFile; char buffer[] = { 'x' , 'y' , 'z' }; pFile = fopen( "myfile.bin" , "wb" ); fwrite(buffer, sizeof(char), sizeof(buffer), pFile );fclose(pFile); return 0; }

fread(ptr,tam,NoEle,archivo)� La función fread lee un bloque de memoria y lo almacena

en el aputador ptr. El bloque de memoria que lee del archivo contiene el numero de elementos especificado en NoEle, cada elemento es de tamaño tam.NoEle, cada elemento es de tamaño tam.

� Ejemplo:

#include <stdio.h>int main () { FILE * pFile; char buffer[3]; pFile = fopen( "myfile.bin" , “rb" ); fread(buffer, sizeof(char), 3*sizeof(char), pFile );fclose(pFile); return 0; }

ftell(archivo)� ftell regresa el tamaño en bytes de un archivo. Se usa en

conjunto con fread para leer datos del archivo

fseek(ptrfile,offset,origen)

� Posición el apuntador al archivo ptrfile a la posición indicada por el origen+offset.

� Los valores preestablecidos para el origen son:� SEEK_SET Inicio del archivo

� SEEK_CUR Posición actual del archivo

� SEEK_END Fin del archivo

fseek(ptrfile,offset,origen)

Ejemplo, ftell fseek#include <stdio.h>

int main(){

FILE * pFile; long size;

pFile = fopen ("myfile.txt","rb"); if (pFile==NULL) printf("El archivo no se puede abri r\n"); else {

fseek (pFile, 0, SEEK_END);size=ftell (pFile); fclose (pFile); printf ("Size of myfile.txt: %ld bytes.\n",size);}

return 0; }

rewind(ptrfile)� La función rewind regresa el apuntador al archivo

ptrfile al inicio del archivo

� Una llamada a rewind es equivalente a:

� fseek(ptrfile, 0, SEEK_SET);� fseek(ptrfile, 0, SEEK_SET);

else { fseek (pFile, 0, SEEK_END);size=ftell (pFile);rewind(pFile);buffer = (char *)malloc(size*sizeof(char));fread(buffer,sizeof(char),size*sizeof(char),pFile) fclose (pFile); }

Ejemplo 1� Escriba un programa que almacene la información de

los alumnos en un archivo

� Cada registro contiene la siguiente información

� matricula� matricula

� Nombre

� Carrera en la que esta inscrito

� Promedio del alumno

� El programa deberá leer la información hasta que se le indique fin de captura.

función escribevoid escribe(FILE * ar){

alumno a;int op;

printf("Proporcione los siguientes datos\n");do{do{

printf("Matricula: ");scanf("%d",&a.matricula);fflu sh(stdin);printf("Nombre: ");gets(a.nombre);printf("Carrera: ");gets(a.carrera);printf("Promedio: ");scanf("%f",&a.promedio);fflus h(stdin);fwrite(&a,sizeof(alumno),1,ar);printf("Desea ingresar mas datos (1-si, 0-No)");scanf("%d",&op);}while(op);

}

MAIN

#include <stdio.h>#include <stdlib.h>

typedef struct{int matricula;char nombre[20];char carrera[20];float promedio;} alumno;

void escribe(FILE * ar);

int main(){{

FILE *archivo;

archivo=fopen("datos.bin","w");if(archivo != NULL)

escribe(archivo);else

printf("El archivo no se puede abrir\n");system("pause");fclose(archivo);return 0;

}

Ejemplo 2� Lee un conjunto archivo que contenga los datos de los

alumnos.

� Cada registro contiene los siguientes datos

� matricula� matricula

� Nombre

� Carrera en la que esta inscrito

� Promedio del alumno

� Despliega los datos de un alumno en particular. La búsqueda será realizada por medio de la matricula del alumno

busquedavoid busqueda(FILE * ar, int mat){

alumno a;int encontrado = 0;

do{fread (& a,sizeof (alumno),1,ar);if (a.matricula == mat)

{printf("Matricula: %d\n",a.matricula);printf("Nombre: %s\n",a.nombre);printf("Carrera: %s\n",a.carrera);printf("Promedio: %2.2f\n",a.promedio);encontrado = 1;}

}while((!encontrado) && (!feof(ar)));printf("El alumno no se encuentra registrado");

}

lecturavoid lectura(FILE * ar){

alumno a;

while (! feof ( ar ))while (! feof ( ar )){

fread(&a,sizeof(alumno),1,ar);printf("Matricula: %d\n",a.matricula);printf("Nombre: %s\n",a.nombre);printf("Carrera: %s\n",a.carrera);printf("Promedio: %2.2f\n",a.promedio);}

}

Mainint main(){

FILE *archivo;int mat;

archivo=fopen("datos.bin","r");if (archivo != NULL)

{lectura(archivo);rewind(archivo);printf("Proporciona la matricula del alumno: ");scanf("%d",&mat);busqueda(archivo,mat);}

elseprintf("El archivo no se puede abrir\n");

system("pause");fclose(archivo);return 0;

}

Proyecto Final� 1ª revisión 7 de Mayo

� 2ª revisión 21 de Mayo

� Fecha de entrega 31 de Mayo

� Temas:� Sistema de reporte de datos del mundial 2010

� Base de datos de un hospital

� Juego del gato

� Conecta 4

� Graficas de funciones