Práctica 11

Anuncio
PROGRAMACIÓN
laboratorio
2007-1
PRÁCTICA 11. ARCHIVOS
 OBJETIVOS:
El alumno aplicará sus conocimientos de registros y archivos con el fin de implementar una base de datos
sencilla y sus funciones de altas, bajas y modificaciones.
 EQUIPO:
 Computadora
 Disco Flexible o algún otro medio para almacenar sus prácticas
 Turbo C (TC)
 G ENERALIDADES
 ARCHIVO
Un archivo es una colección de registros lógicamente relacionados. Los registros son estructuras de campos ó de
elementos de información relacionados de igual manera. La utilización de archivos apoya el registro de información
como una colección de datos. A la colección de datos lógicamente relacionados se le conoce también como base de
datos. El formato para declarar un archivo es :
FILE *var_archivo;
 APERTURA DE UN ARCHIVO
La apertura de un archivo es la creación física y lógica del mismo en el programa de aplicación. Verifica si existe o no
el archivo y direcciona su posición en el lugar de almacenamiento en disco. La función de apertura y su formato es :
var_archivo = fopen(nombre_en_disco_archivo,clave_de_apertura);
Las posibles claves de apertura de archivos son las siguientes :
CLAVE
w
a+
r
rb+
FUNCIÓN
Crear archivo nuevo
Agregar datos a un archivo
Apertura de solo lectura
Apertura para modificacion del archivo
Ejemplo :
arch = fopen("archivo.dat" , "w" );
 OPERACIONES CON ARCHIVOS
La creación inicial de un archivo se le conoce como ALTA inicial del archivo, donde consiste en la captura y validación
de datos. El acceso al archivo para consultar datos es llamado recuperación o CONSULTA de información. El cambiar
de contenido en el archivo se conoce como actualización o MODIFICACION del archivo. Y al proceso de supresión o
eliminación de datos se le llama BAJAS, las cuales pueden ser temporal o definitiva. La baja temporal se implementa
1 de 6
PROGRAMACIÓN
laboratorio
2007-1
con un campo que almacene el estado en que se encuentra el elemento, así estarán dados de alta o de baja en el
mismo archivo. La baja definitiva consiste en la eliminación total de los elementos que se quieren dar de baja.
FUNCIÓN
DESCRIPCIÓN
Grabar un registro en archivo
Leer un registro del archivo
Cerrar el archivo
Posicionar apuntador una una posición del archivo
Obtener la posición actual del apuntador del archivo
Indica la posición de final de archivo
Borrar archivo de disco
Renombrar archivo en disco
fwrite( ... )
fread( ... )
fclose( var_archivo )
fseek( ... )
ftell( ... )
feof( var_archivo )
remove( “ nombre “ )
rename(“antes”,”nuevo” )
 EJEMPLO
#include
#include
#include
#include
#include
<string.h>
<ctype.h>
<stdio.h>
<conio.h>
<stdlib.h>
// Declaración del Registro y Archivo
struct registro {
char name[40];
int
edad;
float sueldo;
int
edo;
} R ;
FILE *arch;
// Generación de un menú de opciones para la base de datos
void menu() {
clrscr();
gotoxy(10, 5);cprintf("[1]
gotoxy(10, 6);cprintf("[2]
gotoxy(10, 7);cprintf("[3]
gotoxy(10, 8);cprintf("[4]
gotoxy(10, 9);cprintf("[5]
gotoxy(10,10);cprintf("[6]
gotoxy(10,11);cprintf("[7]
}
Dar de alta un registro");
Imprimir informaci¢n del archivo");
Consulta por nombre");
Modificaciones");
Baja Temporal");
Baja Definitiva");
Salida ");
// Lectura del Registro
void leeR ( ) {
char cad[40];
gotoxy(10,10); printf("Nombre:
gotoxy(10,12); printf("Edad :
gotoxy(10,14); printf("Sueldo:
R.edo=0;
}
"); gotoxy(20,10); gets(R.name);
"); gotoxy(20,12); gets(cad); R.edad=atoi(cad);
"); gotoxy(20,14); gets(cad); R.sueldo=atof(cad);
// Procedimiento de altas de datos
void altas (
) {
2 de 6
PROGRAMACIÓN
laboratorio
2007-1
char tecla ;
clrscr( ) ;
gotoxy ( 35 , 2 ) ; cprintf ( " ALTAS " );
leeR( );
printf("\n\r Datos leidos:");
printf("\n\r %s",R.name);
printf("\n\r %i",R.edad);
printf("\n\r %.2f",R.sueldo);
printf("\n\r ");
cprintf(R.edo==0?"Alta":"Baja");
printf("\n\r Desea Grabar los Datos(s/n)?" );
tecla=toupper(getch());
if (tecla=='S') {
arch=fopen("a:\\archivo.dat", "a+");
fwrite( &R, sizeof ( struct registro ), 1 , arch );
fclose(arch);
cprintf("\n\r Grabado...");
getch();
}
}
// Procedimiento de consulta general
void imprime ( )
{ clrscr();
gotoxy ( 35 , 2 ) ; cprintf ( " CONSULTA GENERAL " );
cprintf("\n\r
Nombre
Edad
Sueldo
Estado \n\r " ) ;
arch=fopen("a:\\archivo.dat", "r");
fread (&R,sizeof(struct registro),1,arch);
while ( !feof(arch) )
{
cprintf("\n\r
%s
de
%i
años
ganando
%.2f
y
dado
",R.name,R.edad,R.sueldo);
cprintf(R.edo==0?"Alta":"Baja");
fread( &R, sizeof(struct registro ), 1, arch);
}
fclose(arch);
getch();
}
de
// Procedimiento de busqueda por nombre
int busqueda( char cad[40] ) {
int pos = - 1 ;
arch=fopen("a:\\archivo.dat", "r");
while ( !feof(arch) && pos==-1 ) {
fread( &R, sizeof(struct registro),1,arch);
if (strcmp(R.name,cad)==0) pos=ftell(arch)/sizeof(struct registro);
}
fclose(arch);
return (pos);
}
// Procedimiento de consulta por nombre
void consulta() {
char cad[40];
int pos;
clrscr();
gotoxy ( 35 , 2 ) ; cprintf ( " CONSULTA POR NOMBRE " );
gotoxy (
5, 5 ) ; cprintf("\n Introduce nombre a buscar");
gets(cad);
pos=busqueda(cad);
if (pos == - 1) {
gotoxy ( 5 , 10 ); printf(" No se encontro"); }
3 de 6
PROGRAMACIÓN
laboratorio
2007-1
else {
gotoxy ( 5, 10 );
printf("\n Se encontro a: %s %i %f dado de ",
R.edad,R.sueldo );
cprintf(R.edo==0?"Alta":"Baja");
}
getch();
}
// Procedimiento de modificaciones
R.name,
void modifica() {
char cad[40];
char tecla;
int pos,bandera;
clrscr();
gotoxy ( 35 , 2 ) ; cprintf ( " CONSULTA GENERAL " );
gotoxy (
5, 5 ) ; cprintf(" Introduce nombre a modificar :");
gets(cad);
pos=busqueda(cad);
if (pos== - 1 ) { gotoxy ( 5 , 10 ); printf(" No se encontro"); getch( ); }
else {
do {
gotoxy(10,10); cprintf("[1] Nombre = %s ", R.name);
gotoxy(10,11); cprintf("[2] Edad
= %i ", R.edad);
gotoxy(10,12); cprintf("[3] Sueldo
= %.2f ", R.sueldo);
gotoxy(10,13); cprintf("[4] Estado
= " );
cprintf(R.edo==0?"Alta":"Baja");
gotoxy(10,14); cprintf("[5] Terminar");
tecla=getch();
switch(tecla){
case '1' :
gotoxy(23,10);clreol;
gotoxy(23,10);gets(R.name);
break;
case '2' :
gotoxy(23,11);clreol;
gotoxy(23,11); gets(cad);
R.edad=atoi(cad);
break;
case '3' :
gotoxy(23,12);clreol;
gotoxy(23,12); gets(cad);
R.sueldo=atof(cad);
break;
case '4' :
R.edo=R.edo==0?1:0;
break;
} //fin de switch
} while (tecla!='5');
gotoxy(10,15);cprintf("Desea grabar modificacion(S/N)?");
tecla=toupper(getch());
if (tecla=='S'){
cprintf("Grabando...");
arch=fopen("a:\\archivo.dat", "rb+");
fseek(arch,(pos-1)*sizeof(struct registro),SEEK_SET);
fwrite(&R,sizeof(struct registro),1,arch);
fclose(arch);
cprintf("...registro modificado.");
getch( ) ;
}
} // fin de else de encontrarse
}
// Procedimiento de baja temporal
void bajaT() {
char cad[40];
char tecla;
int pos;
clrscr();
4 de 6
PROGRAMACIÓN
laboratorio
2007-1
gotoxy ( 35 , 2 ) ; cprintf ( " BAJA TEMPORAL " );
gotoxy (
5, 5 ) ; cprintf(" Introduce nombre a dar de baja : ");
gets(cad);
pos=busqueda(cad);
if (pos== - 1 ) {
gotoxy ( 5 , 10 ); printf(" No se encontro");
}
else
{
gotoxy(10,12);
cprintf("\n Se encontro a: %s %i %f dado de ",R.name,
R.edad,R.sueldo );
cprintf(R.edo==0?"Alta":"Baja");
gotoxy(10,15);cprintf("Desea darlo de baja temporal(S/N)?");
tecla=toupper(getch());
if (tecla=='S') {
R.edo=1;
arch=fopen("a:\\archivo.dat", "rb+");
fseek(arch,(pos-1)*sizeof(struct registro),SEEK_SET);
fwrite(&R,sizeof(struct registro),1,arch);
fclose(arch);
cprintf("...registro dado de baja");
getch() ;
}
} // fin de else de encontrarse
}
// Procedimiento de eliminación de registro
void elimina() {
char tecla;
char cad[40];
int pos;
FILE *archaux;
clrscr();
gotoxy ( 35 , 2 ) ; cprintf ( " CONSULTA GENERAL " );
gotoxy (
5, 5 ) ; cprintf(" Introduce nombre a modificar :");
gets(cad);
pos=busqueda(cad);
if (pos== - 1 ) { gotoxy ( 5 , 10 ); printf(" No se encontro"); getch ( ) ; }
else
{
gotoxy(5,10);
cprintf("Encontro a %s , con %i ganando %.2f y dado de ",
R.name, R.edad, R.sueldo );
cprintf(R.edo==0?"Alta":"Baja");
gotoxy(5,14);cprintf("Desea eliminarlo(S/N)?");
tecla=toupper(getch());
if (tecla=='S')
{ cprintf("Eliminando...");
archaux = fopen("a:\\auxilio.dat","w");
arch = fopen("a:\\archivo.dat","r");
fread(&R,sizeof(struct registro),1,arch);
while ( !feof(arch) ) {
if (strcmp(R.name,cad)!=0)
fwrite(&R,sizeof(struct registro),1,archaux);
fread(&R,sizeof(struct registro),1,arch);
}
fclose(arch);
fclose(archaux);
remove("a:\\archivo.dat");
rename("a:\\auxiliar.dat", "a:\\archivo.dat");
cprintf("... registro eliminado");
getch();
} // fin tecla Si
} // fin else
}
// Programa principal
void main() {
5 de 6
PROGRAMACIÓN
laboratorio
2007-1
char opc;
do {
menu();
opc=toupper(getch());
switch(opc) {
case '1' :
altas();
break;
case '2' :
imprime();
break;
case '3' :
consulta();
break;
case '4' :
modifica();
break;
case '5' :
bajaT();
break;
case '6' :
elimina();
break;
}
} while (opc!=27 && opc!='7');
}
 ACTIVIDAD
Modificar el código del ejemplo para almacenar la información de los libros en una biblioteca:
a). Titulo
b). Autor
c). Edición
d). Editorial
e). ISBN
f). Numero de ejemplares
6 de 6
Descargar