Vous êtes sur la page 1sur 10

TEMA 5: CREACION ARCHIVOS SECUENCIAL DISCO C++

En este proceso se pretende solamente crear un archivo secuencial en disco. Prog17.cpp


#include <stdio.h> #include <conio.h> #include <string.h> struct { int matricula; char nombre[30]; int edad;}alumno; void main() { clrscr(); //creando y cerrando el archivo en disco FILE *archdisco; archdisco = fopen("c:\\ac\\alumnos.dat","w"); fclose(archdisco); printf("ARCHIVO CREADO"); getchar();getchar(); }

CORRIDA:

Recordar que la estructura que se uso para crear el archivo se deber usar siempre y con el mismo orden cuando se acceda al archivo con los procesos u operaciones anteriormente mencionados. Lo primero que se crea es una variable de tipo puntero o apuntador a un archivo a disco(instruccin FILE y debe ser en MAYUSCULAS) llamada archdisco(muy original). Variables apuntadores son tipos especiales de variables que tienen la capacidad de almacenar no datos, pero si direcciones ya sean de la memoria del computador o como en este caso de una direccion fisica del disco. En C una variable apuntador se declara anteponiendo un asterisco antes del nombre.

En el programa se est creando una variable apuntador bautizada con el nombre de archdisco que almacenara la direccion fisica de el archivo en disco, en algun cilindro, track , sector debera quedar el archivo no es verdad??. Como segundo paso se abre el archivo con la instruccion fopen(): archdisco = fopen(cpp:\\ac\\alumnos.dat,w); Observar que el path es la direccion fisica de tu sitio en TU PC. Observar el doble diagonal(\\) en el parametro. La funcion fopen() cuando realiza el trabajo de abrir un archivo, regresa la direccion fisica donde crea o graba el archivo en disco. El primer parametro o argumento en esta funcin es la UNIDAD de disco y el nombre del archivo. El segundo parametro o argumento es llamado modo y es una de los varios modos que podemos usar.

r Lectura. w Escritura. a Append, si el archivo ya existe append empieza a aadir los nuevos datos al final del archivo ya existente. r+ Lectura y escritura, ya debe existir el archivo. w+ Crea para lectura y escritura y si ya existe, sobreescribe. a+ Crea o abre para lectura y append, sino existe el archivo sera creado.

En adicion a los valores listados tambien es permitido agregar uno de los siguientes caracteres, pero insertandolo antes del signo + modo significado.

t lo abre en modo texto. b lo abre en modo binario.

Cuando se ha finalizado de escribir al archivo se debe cerrar y esto se hace con la instruccin: fclose(archdisco);

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:

La primera observacin 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 instrucin 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 direccines fisicas de algun lugar de la memoria del computador. Por supuesto tambien que en ese espacio o bodega en memoria se almacenaran datos o informacin, es el operador &(ampersand) quien se usa para accesar a esos datos, ejemplo: Float *pi; aqui se crea una variable apuntador que guardara la direccin 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 direccin 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 informacin 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 tamao 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 habra 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 opcin 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 direccin 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 ley 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:

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. TEMA 7: BUSQUEDA ARCHIVOS C++

En este tema se analiza la busqueda de un registro o rengln determinado. En este proceso el usuario del programa quiere que se despliegue un y solo un registro de informacin proporcionando un dato de busqueda generalmente la clave del registro. prog20.cpp
#include <stdio.h> #include <conio.h> #include <string.h> struct { int matricula; char nombre[30]; int edad;} alumno; void main() { clrscr(); // cargando clave a buscar printf("dame matricula buscar:"); int clave; scanf("%d",&clave);getchar(); //abriendo, leyendo,cargando estructura 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 estructura buscada if ( clave == alumno.matricula) { 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(); }

corrida:

Recordar que la caracteristica principal de un archivo secuencial de c++ es que no es posible acceder o accesar a un registro o renglon especifico o determinado sino que se debera recorrer todos los n-1 renglones anteriores. Esta situacin se da porque al construir un registro cualquiera con una montn de campos strings a la hora de almacenar dichos registros, estos registros tendran tamaos diferentes, esta es la razon principal por la cual al buscar un registro especifico se tiene que recorrer y validar todos los registros anteriores. En el programa ejemplo se esta usando un ciclo while fread para recorrer todos los registros del archivo, por supuesto que si se tiene un archivo con 5000 registro y el buscado es el 4500 al menos se se tendra que recorrer todos los 4499 registros anteriores. TEMA 11: EDICION DE REGISTROS C++

Editar registros significa cambiar el contenido de algunos de los campos o columnas por nueva informacn o para corregir algun error de captura original o para agregar alguna columna que no existia por modificacin de la tabla o la base de datos. La solucion es similar a los temas anterior, es decir se ocupan los dos archivos el original y el temporal y ya sea que se modifique una sola clave o se modifiquen todos los registros el ejemplo que se construye va mostrando los registros del archivo y pregunta y modifica o edita el registro pedido. Prog24.cpp

#include <stdio.h> #include <stdlib.h> #include <io.h> #include <conio.h> #include <string.h> struct { int matricula; char nombre[30]; int edad;} alumno; void main() { clrscr(); // cargando clave a editar printf("dame matricula editar:"); int clave; scanf("%d",&clave);getchar(); FILE *arch1; FILE *arch2; arch1 = fopen("cpp:\\ac\\alumnos.dat","r+"); arch2 = fopen("cpp:\\ac\\temporal.dat","at+"); // aqui siempre debe empezar el ciclo de lectura // y fread() regresa siempre cuantas estructuras leyo while(fread(&alumno,sizeof(alumno),1,arch1)==1) { if ( clave == alumno.matricula) { printf("dame nuevo nombre :");gets(alumno.nombre); printf("dame nueva edad :");scanf("%d",&alumno.edad); fwrite(&alumno,sizeof(alumno),1,arch2); } else { fwrite(&alumno,sizeof(alumno),1,arch2); }; }; // aqui termina while //cerrando archivos

fclose(arch1); fclose(arch2); // removiendo y renombrando archivos // recordar que directorios y archivos de datos no // mas de 8.3 letras remove("cpp:\\AC\\ALUMNOS.DAT "); rename("cpp:\\AC\\TEMPORAL.DAT","cpp:\\AC\\ALUMNOS.DAT "); //avisando puts("REGISTRO EDITADO"); getchar();getchar(); }

corrida:

corrida prog19.cpp

TEMA 9: BAJAS O ELIMINACIONES ARCHIVOS DISCO C++

Eliminacin o bajas es el proceso por medio del cual algunos registros del archivo son purgados del archivo, existen dos maneras por las cuales se puede realizar ese proceso. En la primera manera de la cual se proporciona el ejemplo correspondiente se usaran dos archivos, el archivo original y un archivo temporal, el procedimiento o algoritmo es muy sencillo, se lee el registro del archivo original y si no es el registro a eliminar entonces se almacena en el archivo temporal, cuando se termina de procesar todo el archivo original, el archivo temporal solo contendra todos los registros que no se quisieron eliminar, ya con estos dos archivo se procede a eliminar o borrar usando la instruccion remove de el archivo original y se procede a renombrar usando la instruccin rename de el archivo temporal como nuevo archivo original. prog22.cpp:

#include <stdio.h> #include <stdlib.h> #include <io.h> #include <conio.h> #include <string.h> struct { int matricula; char nombre[30]; int edad;} alumno; void main() { clrscr(); // cargando clave a eliminar printf("dame matricula eliminar:"); int clave; scanf("%d",&clave);getchar(); FILE *arch1; FILE *arch2; arch1 = fopen("cpp:\\ac\\alumnos.dat","r+"); arch2 = fopen("cpp:\\ac\\temporal.dat","at+"); // aqui siempre debe empezar el ciclo de lectura // y fread() regresa siempre cuantas estructuras leyo while(fread(&alumno,sizeof(alumno),1,arch1)==1) { if ( clave != alumno.matricula) fwrite(&alumno,sizeof(alumno),1,arch2); }; // aqui termina while //cerrando archivos fclose(arch1); fclose(arch2); // removiendo y renombrando archivos // recordar que directorios y archivos de datos no // mas de 8.3 letras remove("cpp:\\AC\\ALUMNOS.DAT "); rename("cpp:\\AC\\TEMPORAL.DAT","cpp:\\AC\\ALUMNOS.DAT "); //avisando

puts("registro eliminado"); getchar(); }

archivo original PROG19:

corrida prog22

corrida prog19

pobre ana maria se desparecio:>) EL problema con esta manera de eliminar incluso fisicamente los registros del archivo es que no hay manera de recuperar esa informacin posteriormente. Es por eso que otra tecnica comn de eliminacin es incluir un campo de estado, status o bandera o semaforo en el registro y conforme se va cargando el registro y antes de mandarlo a disco se le agrega a dicho campo el caracter 'A' alta, asi que cuando se quiera una baja solo se pondria dicho campo en 'B' y todos los programas de lectura, busqueda y filtros deberan revisar esta campo de estado antes de hacer algo con el registro.

Vous aimerez peut-être aussi