Archivos de Acceso Aleatoriogalia.fc.uaslp.mx/~rmariela/programacion/unidad62.pdf · 2012-02-25 ·...
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