[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