UNIDAD 5: C++ REGISTROS Y ARCHIVOS SECUENCIALES C++

TEMA 6: GRABACION Y LECTURA DISCO C++


Como ya se menciono grabar y lectura de registros o estructuras a renglones o registros de archivos en disco.

Estos dos procesos son los casos mas comunes y frecuentes que se pueden realizar con un archivo de disco.

GRABACION DE UNA ESTRUCTURA A UN ARCHIVO EN DISCO

prog18.cpp

#include <stdio.h>
#include <conio.h>
#include <string.h>
struct {
int matricula;
char nombre[30];
int edad;} alumno;
void main() {
clrscr();
// captura de campos
printf("dame matricula :");scanf("%d",&alumno.matricula);getchar();
printf("dame nombre :");gets(alumno.nombre);
printf("dame edad :");scanf("%d",&alumno.edad);
// grabando a disco
FILE *archdisco;
archdisco = fopen("cpp:\\ac\\alumnos.dat","at+");
fwrite(&alumno,sizeof(alumno),1,archdisco);
fclose(archdisco);
//avisando usuario
printf("alumno insertado");
getchar();getchar();
}

corrida:

image209.jpg

La primera observación es que se esta usando el “fopen()” en modo “at+” en lugar de modo “w” pero es para matar dos pajaros de un tiro, reestudiar la clase anterior de modos de apertura.

La unica instrución nueva es:

fwrite(&persona,sizeof(alumno),1,archdisco);

Como se observa ocupa 4 parametros que son:

Con apuntadores se manejan dos operadores diferentes que son ( * y &) el asterisco como ya se indico se usa para crear una variable apuntador, es decir variables que almacenaran direcciónes fisicas de algun lugar de la memoria del computador.

Por supuesto tambien que en ese espacio o bodega en memoria se almacenaran datos o información, es el operador &(ampersand) quien se usa para accesar a esos datos, ejemplo:

Float *pi; aqui se crea una variable apuntador que guardara la dirección donde se almacenara un valor de tipo float. Si en ese programa, se usa: pi= 3.1416, el compilador protesta porque se esta pretendiendo almacenar un valor float en una variable que solo puede almacenar direcciones de memoria. Pero si es valido &pi=3.1416, es decir cuando usamos el operador ampersand estamos trabajando con el contenido de una dirección de memoria, es por eso que: 1.-PRIMER PARAMETRO: fwrite() ocupa primero conocer cuales datos va a almacenar en disco, aqui se le esta indicando que es el dato que se tiene en la direccion de memoria donde esta el registro “alumno”. 2.- SEGUNDO PARAMETRO: fwrite(), ocupa conocer cuantos bytes de información debe grabar, para esto se tienen dos opciones o se le da el valor exacto por ejemplo 64 bytes o 39 bytes o mas facil aun se usa sizeof() que regresa el tamaño del dato. 3.- TERCER PARAMETRO: fwrite(), necesita conocer tambien cuantas estructuras o registros a la vez debe grabar por lo general es un solo registro, pero mas adelante estudiaran que es posible grabar mas de un registro a la vez y esto es de mucho provecho, porque por ejemplo si en un sistema se ocupa grabar 1000 registros y usamos fwrite() de uno en uno, quiere decir que habría mil accesos a disco. 4.-CUARTO PARAMETRO: fwrite() tambien ocupa conocer exactamente en que cluster, sector y byte exacto del disco duro debe grabar el registro, la primera opción seria desarmar el disco duro y ver donde hay lugar para poner el archivo J o mejor aun usar la variable archdisco que ya tiene esa dirección fisica del archivo en disco. LECTURA DE REGISTROS Prog19.CPP <code> #include <stdio.h> #include <conio.h> #include <string.h> struct { int matricula; char nombre[30]; int edad;} alumno; void main() { clrscr(); leyendo disco

FILE *archdisco;

archdisco = fopen(“cpp:\\ac\\alumnos.dat”,”at+”);

aqui siempre debe empezar el ciclo de lectura y fread() regresa siempre cuantas estructuras leyo

while(fread(&alumno,sizeof(alumno),1,archdisco)==1)

{

desplegando estructuras printf(“MATRICULA =%d ”,alumno.matricula); printf(” NOMBRE =%s ”,alumno.nombre); printf(” MESES =%d ”,alumno.edad); printf(“\n”); }; aqui termina while

no olvidar cerrar archivo y siempre fuera de while fclose(archdisco); getchar();getchar(); } </code> corrida: image210.jpg Las unicas notas son : En fopen() se uso modo “a+”. En lugar de fwrite(), se usa fread() con los mismos cuatro parametros. Tambien recordar que fread(), nos regresa la cantidad de registros que leyo del disco, por eso el ciclo while se convierte en falso cuando fread() regresa 0 y esto indica que se llego al fin del archivo. Y seria bueno que el despliegue fuese en una tabla pero esto queda de tarea. TAREAS PROGRAMACION C++ 1.-crear, cargar y leer un archivo C++ de mercancias y otro de empleados y agregar un ciclo para el proceso de captura y no tener que estar ejecutando el programa de captura un monton de veces.

Politica de Privacidad