Examen de ficheros y estructuras
Programación, Informática, clases, C\C++ 24 Abril, 2006Hoy tuve examen de C, está vez tocaba ficheros y estructuras. Como viene siendo tradicional por mi parte, tenéis a vuestra disposición el ejercicio tal cual lo presente en el examen. El ejercicio nos pedía utilizar una estructura, propuesta en el ejercicio, para almacenar en un fichero los datos sobre los productos de un almacén, para ello contamos con el fichero almacen.dat donde tenemos los productos después de ser actualizados y un fichero cambios.dat donde tendremos los datos que han sido borrados, modificados o creados partiendo de los datos guardados en almacen.dat. Para guardar estos cambios en el fichero almacen.dat debemos llamar a una función actualizar( ); y almacenar o borrar si procede los datos que están en cambios.dat a el fichero almacen.dat, para lo que podemos utilizar un tercer fichero auxiliar.
No me lío más y aquí tenéis el fuente del programa. Para aclarar dudas preguntar por Makumba, el muchacho tiene respuestas para todo jeje.
Descargar | Código Fuente
-
#include <stdio .h>
-
#include <conio .h>
-
#include <stdlib .h>
-
#include <string .h>
-
typedef struct almacen
-
{
-
char codigo[5];
-
char descripcion[61];
-
int precio;
-
int cantidad;
-
}producto;
-
-
void cargar();
-
void visualizar(char nombre[40]);
-
int menu();
-
void borrar();
-
void actualizar();
-
void modificar();
-
void ordenar();
-
-
void main()
-
{
-
int opcion;
-
do{
-
opcion=menu();
-
switch(opcion)
-
{
-
case 1:
-
clrscr();
-
visualizar("almacen.dat");
-
getche();
-
break;
-
case 2:
-
clrscr();
-
cargar();
-
break;
-
case 3:
-
clrscr();
-
borrar();
-
break;
-
case 4:
-
clrscr();
-
modificar();
-
break;
-
case 5:
-
clrscr();
-
actualizar();
-
getche();
-
break;
-
case 6:
-
clrscr();
-
visualizar("cambios.dat");
-
getche();
-
break;
-
case 7:
-
clrscr();
-
ordenar();
-
getche();
-
break;
-
case 8:
-
clrscr();
-
opcion=9;
-
break;
-
default:
-
menu();
-
}
-
}while(opcion!=9);
-
}
-
-
int menu()
-
{
-
int resp;
-
do{
-
clrscr();
-
scanf("%d",&resp); fflush(stdin);
-
}while(resp!=1 && resp!=2 && resp!=3 && resp!=4 && resp!=5 && resp!=6 && resp!=7 && resp!=8);
-
return(resp);
-
}
-
-
void visualizar(char nombre[40])
-
{
-
//pasamos como argumento el nombre del fichero para que sirva
-
//para ambos ficheros.
-
-
//usamos funcion gotoxy para situar los datos en pantalla
-
FILE *fichero;
-
producto pro;
-
int i;
-
if((fichero=fopen(nombre, "rb"))==NULL)
-
{
-
exit(1);
-
}
-
gotoxy(1,1);
-
gotoxy(15,1);
-
gotoxy(50,1);
-
gotoxy(60,1);
-
for(i=1; i<70; i++)
-
{
-
gotoxy(i,2);
-
}
-
i=3;
-
while(fread(&pro, sizeof(producto), 1, fichero)!=NULL)
-
{
-
gotoxy(1,i);
-
gotoxy(15,i);
-
gotoxy(50,i);
-
gotoxy(60,i);
-
i++;
-
}
-
fclose(fichero);
-
}
-
-
void cargar()
-
{
-
//nuevos datos que seran almacenados en el fichero cambios.dat
-
FILE *fichero;
-
producto pro;
-
char resp;
-
-
if((fichero=fopen("cambios.dat", "a+b"))==NULL)
-
{
-
exit(1);
-
}
-
do{
-
gets(pro.codigo);
-
fflush(stdin);
-
gets(pro.descripcion);
-
fflush(stdin);
-
scanf("%d", &pro.precio);
-
fflush(stdin);
-
scanf("%d", &pro.cantidad);
-
fflush(stdin);
-
scanf("%c", &resp);fflush(stdin);
-
fwrite(&pro, sizeof(producto), 1, fichero);
-
}while(resp!='n');
-
fclose(fichero);
-
}
-
void borrar()
-
{
-
//los ficheros para borrar en la proxima actualizacion, marcados con
-
//pro.codigo=-1 para identificarlos en la actualizacion
-
FILE *modificado, *original;
-
char mod[40];
-
producto pro;
-
visualizar("almacen.dat");
-
if((modificado=fopen("cambios.dat", "a+b"))==NULL || (original=fopen("almacen.dat", "r+b"))==NULL)
-
{
-
exit(1);
-
}
-
gets(mod); fflush(stdin);
-
while(fread(&pro, sizeof(producto), 1, original)!=NULL)
-
{
-
if(strcmp(mod,pro.codigo)==0)
-
{
-
pro.cantidad=-1;
-
fwrite(&pro,sizeof(producto),1,modificado);
-
}
-
}
-
fclose(modificado);
-
fclose(original);
-
}
-
-
void actualizar()
-
{
-
FILE *fichero, *modificado, *temporal;
-
//en el fichero temporal incluimos los registros antiguos, actualizados.
-
producto pro;
-
producto pro_mod;
-
int sw=0;
-
long int tam=sizeof(pro);
-
if((fichero=fopen("almacen.dat", "r+b"))==NULL
-
|| (modificado=fopen("cambios.dat", "r+b"))==NULL
-
|| (temporal=fopen("temporal.dat", "a+b"))==NULL)
-
{
-
exit(1);
-
}
-
while(fread(&pro_mod, sizeof(producto), 1, modificado)!=NULL)
-
{
-
fseek(fichero,0L,SEEK_SET);
-
while(fread(&pro, sizeof(producto), 1, fichero)!=NULL)
-
{
-
if(strcmp(pro_mod.codigo,pro.codigo)==0)
-
{
-
//guardamos los registros que han cambiado
-
//no copiamos los productos que se van a eliminar
-
if (pro_mod.cantidad!=-1)
-
fwrite(&pro_mod, sizeof(producto), 1, temporal);
-
sw=1;
-
-
}
-
}
-
if (sw==0)
-
{
-
//guardamos los nuevos registros
-
fwrite(&pro_mod, sizeof(producto), 1, temporal);
-
sw=0;
-
}
-
}
-
-
//Para los registros antiguos
-
sw=0;
-
fseek(fichero,0L,SEEK_SET);
-
while(fread(&pro, sizeof(producto), 1, fichero)!=NULL)
-
{
-
fseek(modificado,0L,SEEK_SET);
-
while(fread(&pro_mod, sizeof(producto), 1, modificado)!=NULL)
-
{
-
//recorremos los modificado para ver si el producto original no ha sido
-
//tocado
-
if(strcmp(pro_mod.codigo,pro.codigo)==0)
-
sw=1;
-
}
-
if (sw==0)
-
{
-
//guardamos los antiguos registros
-
fwrite(&pro, sizeof(producto), 1, temporal);
-
}
-
sw=0;
-
}
-
fclose (fichero);
-
remove ("almacen.dat");
-
fclose (modificado);
-
remove ("cambios.dat");
-
fclose (temporal);
-
rename ("temporal.dat","almacen.dat");
-
}
-
void modificar()
-
{
-
FILE *modificado, *original;
-
char mod[40];
-
producto pro;
-
producto pro_mod;
-
visualizar("almacen.dat");
-
if((modificado=fopen("cambios.dat", "a+b"))==NULL || (original=fopen("almacen.dat", "r+b"))==NULL)
-
{
-
exit(1);
-
}
-
gets(mod); fflush(stdin);
-
while(fread(&pro, sizeof(producto), 1, original)!=NULL)
-
{
-
if(strcmp(mod,pro.codigo)==0)
-
{
-
gets(pro.descripcion);
-
fflush(stdin);
-
scanf("%d", &pro.precio);
-
fflush(stdin);
-
scanf("%d", &pro.cantidad);
-
fflush(stdin);
-
fwrite(&pro,sizeof(producto),1,modificado);
-
}
-
}
-
fclose(modificado);
-
fclose(original);
-
}
-
-
void ordenar()
-
{
-
FILE *original, *temporal;
-
producto pro;
-
char **array;
-
char aux[5];
-
int i,j, cant_reg, total_reg;
-
if((original=fopen("almacen.dat", "rb"))==NULL
-
|| (temporal=fopen("temporal.dat", "a+b"))==NULL)
-
{
-
exit(1);
-
}
-
//cant_reg tenemos que calcular cantidad de registros
-
//asignacion dinamica para array con el numero de registros
-
fseek(original,0L,SEEK_END);
-
total_reg=(int)ftell(original);
-
cant_reg=total_reg/sizeof(producto);
-
fseek(original,0L,SEEK_SET);
-
array=(char **)malloc(sizeof(char*)*5);
-
for (i=0;i<cant_reg ;i++)
-
{
-
array[i]=(char *)malloc(sizeof(char)*5);
-
}
-
i=0;
-
while(fread(&pro, sizeof(producto), 1, original)!=NULL)
-
{
-
strcpy(array[i++], pro.codigo);
-
}
-
-
//ordenamos los codigos
-
for(i=0;i<(cant_reg);i++)
-
{
-
for (j=(cant_reg)-1;j>0;j--)
-
{
-
if(strcmp(array[j],array[j-1])<0)
-
{
-
strcpy(aux,array[j]);
-
strcpy(array[j],array[j-1]);
-
strcpy(array[j-1],aux);
-
}
-
}
-
}
-
-
for(i=0;i</cant_reg><cant_reg ; i++)
-
{
-
fseek(original,0L,SEEK_SET);
-
while(fread(&pro, sizeof(producto), 1, original)!=NULL)
-
{
-
if(strcmp(pro.codigo, array[i])==0)
-
{
-
fwrite(&pro,sizeof(producto),1,temporal);
-
break;
-
}
-
}
-
-
}
-
fclose (original);
-
remove ("almacen.dat");
-
fclose (temporal);
-
rename ("temporal.dat","almacen.dat");
-
-
-
}
6-Junio,2007 a las 11:36 pm
en cuanto tiempo hiciste este program……
pregunto.
esta bunisimo…
7-Junio,2007 a las 5:33 am
Hola Josue, pues ese ejercicio lo hice en 1.40 más o menos que es lo que tardé en hacer ese examen aproximadamente.