archivos de acceso aleatoriogalia.fc.uaslp.mx/~rmariela/programacion/unidad62.pdf · 2012-02-25 ·...
TRANSCRIPT
![Page 1: 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](https://reader035.vdocuments.pub/reader035/viewer/2022080722/5f7bb98ed2b747116b65f067/html5/thumbnails/1.jpg)
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
![Page 2: 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](https://reader035.vdocuments.pub/reader035/viewer/2022080722/5f7bb98ed2b747116b65f067/html5/thumbnails/2.jpg)
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; }
![Page 3: 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](https://reader035.vdocuments.pub/reader035/viewer/2022080722/5f7bb98ed2b747116b65f067/html5/thumbnails/3.jpg)
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; }
![Page 4: 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](https://reader035.vdocuments.pub/reader035/viewer/2022080722/5f7bb98ed2b747116b65f067/html5/thumbnails/4.jpg)
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)
![Page 5: 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](https://reader035.vdocuments.pub/reader035/viewer/2022080722/5f7bb98ed2b747116b65f067/html5/thumbnails/5.jpg)
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; }
![Page 6: 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](https://reader035.vdocuments.pub/reader035/viewer/2022080722/5f7bb98ed2b747116b65f067/html5/thumbnails/6.jpg)
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); }
![Page 7: 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](https://reader035.vdocuments.pub/reader035/viewer/2022080722/5f7bb98ed2b747116b65f067/html5/thumbnails/7.jpg)
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.
![Page 8: 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](https://reader035.vdocuments.pub/reader035/viewer/2022080722/5f7bb98ed2b747116b65f067/html5/thumbnails/8.jpg)
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);
}
![Page 9: 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](https://reader035.vdocuments.pub/reader035/viewer/2022080722/5f7bb98ed2b747116b65f067/html5/thumbnails/9.jpg)
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;
}
![Page 10: 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](https://reader035.vdocuments.pub/reader035/viewer/2022080722/5f7bb98ed2b747116b65f067/html5/thumbnails/10.jpg)
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
![Page 11: 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](https://reader035.vdocuments.pub/reader035/viewer/2022080722/5f7bb98ed2b747116b65f067/html5/thumbnails/11.jpg)
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");
}
![Page 12: 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](https://reader035.vdocuments.pub/reader035/viewer/2022080722/5f7bb98ed2b747116b65f067/html5/thumbnails/12.jpg)
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);}
}
![Page 13: 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](https://reader035.vdocuments.pub/reader035/viewer/2022080722/5f7bb98ed2b747116b65f067/html5/thumbnails/13.jpg)
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;
}
![Page 14: 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](https://reader035.vdocuments.pub/reader035/viewer/2022080722/5f7bb98ed2b747116b65f067/html5/thumbnails/14.jpg)
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