[C con Clase] Ayuda urgente
Steven Davidson
srd4121 en njit.edu
Mar Sep 9 20:38:25 CEST 2008
Hola Cristian,
Cristian wrote:
> Hola, tengo este programa, es con base a un archivo que tengo en mi
> computadora y se llama alumnos.txt este archivo es usado para el
> siguientcódigo, el problema que tengo es que cuando realiza la
> busqueda y el ID no se encuentra, el programa truena y se cierra, no
> deberia de pasar eso, ya intente agregando algunos ifs pero no
> funciono.
>
Veamos el código fuente.
[CORTE]
> fscanf(apuntFile,"%d %s %f %f %f",&d1,&name,&f1,&f2,&f3);
Tienes un error. 'name' es una cadena de caracteres y por tanto ya es
una dirección de memoria. Debes eliminar el operador & para las cadenas
de caracteres. Esto es,
fscanf( apuntFile, "%d %s %f %f %f", &d1, name, &f1, &f2, &f3 );
De todas maneras, no necesitas estas variables auxiliares. Simplemente
usa los miembros directamente:
fscanf( apuntFile, "%d %s %f %f %f",
&datos[c].id,
datos[c].nombre,
&datos[c].c1, &datos[c].c2, &datos[c].c3 );
>
[CORTE]
> printf("Que ID buscas? ");
> scanf("%d",&dato);
> i=0;
> while(datos[i].nombre!=NULL)
Aquí tienes el problema. En primer lugar, la condición es inservible.
elcampo 'nombre' es un array y por tanto nunca será nulo. Recuerda que
un array ES una dirección de memoria gestionado por el compilador. Por
lo tanto, un array no puede ser nulo; debe existir una dirección de
memoria válida.
En segundo lugar, y he aquí el problema, no verificas el índice del
array. Como no existe un control para los valores de 'i', estarás
accediendo a direcciones de memoria que no son tuyas. Además, el bucle
puede ser infinito, porque la condición será falsa para las primeras 20
iteraciones. Ahora bien, en la práctica, podríamos alcanzar algún valor
de 'NULL' que nos beneficie, pero en teoría, no es así.
La solución es controlar los valores de 'i'. Como no quieres terminar el
bucle al encontrar el primer 'id', entonces necesitas recorrer todos los
elementos; esto es,
for( i=0; i<20; i++ )
{
...
}
Sugiero #definir una constante si usas C. Por ejemplo,
#define MAX_REGISTROS 20
...
struct registro datos[MAX_REGISTROS];
...
/* Buscar */
for( i=0; i<MAX_REGISTROS; i++ )
{
...
}
> {
> if(datos[i].id==dato)
> {
> printf("%d\t",datos[i].id);
> printf("%s\t",datos[i].nombre);
> printf("%f\n",datos[i].prom);
> encontrado=1;
> getchar(); getchar();
>
> }
> i++;
> }//end while
> if (encontrado==0)
> printf("No se encontró esa matrícula\n");
> getchar();
> }
También tienes un posible error en los primeros bucles: controla el
índice 'c'.
Espero que esto te oriente.
Steven
Más información sobre la lista de distribución Cconclase