Cosa absurda (C - Archivos)
Publicado por argio (1 intervención) el 25/06/2010 02:09:32
Bueno, como explicar ésto, tengo una base de datos de unos 54k, estructurada así:
struct {
int ART ;
char DESC[20] ;
int STOCK ;
char PROVE[15];
float PRECIO ;
} ;
tengo que sacar cual es el proveedor con más variedad de artículos(diferentes, el stock y demás ni se tiene en cuenta, lo que se tiene en cuenta es cuantas veces aparece el proveedor en la bd)
bueno, lo ridículo es que, con un código en la cual la lógica es absolutamente correcta, me muestra erróneamente el resultado(no muestra el proveedor, y pone cualquier numero en la cantidad de veces que aparece), pero, con el MISMO codigo, y , un paso de más, lo muestra correctamente
lo analizé y lo analizé y sigo afirmando que ese paso está de más, pero si se lo saco, lo muestra erróneamente.
Código con el que anda:
(el paso de más es que copia el nombre del proveedor en el string auxiliar "pro", pero, si se lo quito, deja de mostrar el resultado correctamente.)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct PRODUCTO{
int ART;
char DESC[20];
int STOCK;
char PROVE[15];
float PRECIO;
};
void main(){
FILE *fp;
FILE * aux;
int can , canMay ;
char pro [15] , proMay [15];
struct PRODUCTO pr1 , pr2;
if((fp=fopen("BD","r+b"))==NULL)
{
printf("errorfp");
exit(1);
}
if((aux=fopen("BD","rb"))==NULL)
{
printf("erroraux");
exit(1);
}
canMay = 0;
fread(&pr1,sizeof(pr1),1,fp);
while(!feof(fp))
{
can = 0;
strcpy(pro , pr1.PROVE); //esto es parte del paso de mas
fread(&pr2,sizeof(pr2),1,aux);
while(!(feof(aux)))
{
if(strcmp (pro , pr2.PROVE)==0)//esto sería lo mismo que compararlo contra pr1.PROVE
{
can++;
strcpy( pro , pr1.PROVE);//de más
}
fread(&pr2,sizeof(pr2),1,aux);
}
rewind(aux);
if(canMay < can)
{
canMay = can;
strcpy(proMay , pro);
}
fread(&pr1,sizeof(pr1),1,fp);
}
fclose(fp);
fclose(aux);
printf("\n\nMAYOR PROVEEDOR %s" , proMay);
printf("\nPRODUCTOS %d\n\n" , canMay);
getchar();
printf("\n\nFIN DEL PROGRAMA\n");
getchar();
}
Bueno, si a ese codigo, le quitas la parte de strcpy(pro , pr1.PROVE), y, despues en :
if(strcmp (pro , pr2.PROVE)==0), a pro lo reemplazas por pr1.prove, y , en los otros 2 reemplazas pro por pr1.prove también, el programa no muestra el resultado correctamente
es totalmente absurdo, alguien que me pueda dar una mano, espero que se haya entendido, más o menos.
struct {
int ART ;
char DESC[20] ;
int STOCK ;
char PROVE[15];
float PRECIO ;
} ;
tengo que sacar cual es el proveedor con más variedad de artículos(diferentes, el stock y demás ni se tiene en cuenta, lo que se tiene en cuenta es cuantas veces aparece el proveedor en la bd)
bueno, lo ridículo es que, con un código en la cual la lógica es absolutamente correcta, me muestra erróneamente el resultado(no muestra el proveedor, y pone cualquier numero en la cantidad de veces que aparece), pero, con el MISMO codigo, y , un paso de más, lo muestra correctamente
lo analizé y lo analizé y sigo afirmando que ese paso está de más, pero si se lo saco, lo muestra erróneamente.
Código con el que anda:
(el paso de más es que copia el nombre del proveedor en el string auxiliar "pro", pero, si se lo quito, deja de mostrar el resultado correctamente.)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct PRODUCTO{
int ART;
char DESC[20];
int STOCK;
char PROVE[15];
float PRECIO;
};
void main(){
FILE *fp;
FILE * aux;
int can , canMay ;
char pro [15] , proMay [15];
struct PRODUCTO pr1 , pr2;
if((fp=fopen("BD","r+b"))==NULL)
{
printf("errorfp");
exit(1);
}
if((aux=fopen("BD","rb"))==NULL)
{
printf("erroraux");
exit(1);
}
canMay = 0;
fread(&pr1,sizeof(pr1),1,fp);
while(!feof(fp))
{
can = 0;
strcpy(pro , pr1.PROVE); //esto es parte del paso de mas
fread(&pr2,sizeof(pr2),1,aux);
while(!(feof(aux)))
{
if(strcmp (pro , pr2.PROVE)==0)//esto sería lo mismo que compararlo contra pr1.PROVE
{
can++;
strcpy( pro , pr1.PROVE);//de más
}
fread(&pr2,sizeof(pr2),1,aux);
}
rewind(aux);
if(canMay < can)
{
canMay = can;
strcpy(proMay , pro);
}
fread(&pr1,sizeof(pr1),1,fp);
}
fclose(fp);
fclose(aux);
printf("\n\nMAYOR PROVEEDOR %s" , proMay);
printf("\nPRODUCTOS %d\n\n" , canMay);
getchar();
printf("\n\nFIN DEL PROGRAMA\n");
getchar();
}
Bueno, si a ese codigo, le quitas la parte de strcpy(pro , pr1.PROVE), y, despues en :
if(strcmp (pro , pr2.PROVE)==0), a pro lo reemplazas por pr1.prove, y , en los otros 2 reemplazas pro por pr1.prove también, el programa no muestra el resultado correctamente
es totalmente absurdo, alguien que me pueda dar una mano, espero que se haya entendido, más o menos.
Valora esta pregunta
0