Está en la página 1de 14

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.
 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
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 abrir\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);
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
 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 escribe
void escribe(FILE * ar)
{
alumno a;
int op;

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


do{
printf("Matricula: ");scanf("%d",&a.matricula);fflush(stdin);
printf("Nombre: ");gets(a.nombre);
printf("Carrera: ");gets(a.carrera);
printf("Promedio: ");scanf("%f",&a.promedio);fflush(stdin);
fwrite(&a,sizeof(alumno),1,ar);
printf("Desea ingresar mas datos (1-si, 0-No)");
scanf("%d",&op);
}while(op);
}
#include <stdio.h>
#include <stdlib.h>

typedef struct{

MAIN 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
 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
busqueda
void 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");
}
lectura
void lectura(FILE * ar)
{
alumno a;

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);
}
}
Main
int 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);
}
else
printf("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

También podría gustarte