Ver Mensaje Individual
  #2 (permalink)  
Antiguo 09/12/2010, 01:40
Fw190
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: Duda sobre Sudoku

La función fopen te devuelve un puntero a FILE, que es una estructura de datos definida en stdio.h. El error de segmentación te lo daba porque FILE no lo habías pasado como puntero pero estabas intentando utilizarlo en funciones que lo esperan como puntero.

Otra cosa que he visto es que cuando abres el fichero estás haciendo:

F = fopen(....);

y acto seguido haces

if ((F = fopen(....)) == NULL)

con lo cual estás abriendo el mismo fichero DOS veces sobre la misma estructura FILE. La segunda sobreescribe a la primera. Esto supone que, al finalizar el programa, aunque cierres el fichero (con fclose(F), que, por cierto, no veo que lo hayas hecho), aún se te puede quedar el fichero abierto, pudiendo pasar desde nada a encontrarte con un fichero inservible.

Y un mero detalle "estético", yo intercambiaría los nombres de las funciones. Estás llamando leer_fichero a la función donde estás leyendo la dificultad, y leer_dificultad a la función donde estás leyendo el fichero.

Yo dejaría algo así como:

Código C:
Ver original
  1. void leer_dificultad(void)
  2. {
  3.     char opcion, nombre_fichero[20];
  4.  
  5.     opcion = leer_opcion();  // Esta presentaría el menú de opciones disponibles
  6.     switch (opcion)
  7.     {
  8.         case 'f':
  9.             strcpy(nombre_fichero, "Facil");
  10.             break;
  11.         case 'm':
  12.             strcpy(nombre_fichero, "Medio");
  13.             break;
  14.         case 'f':
  15.             strcpy(nombre_fichero, "Dificil");
  16.             break;
  17.     }
  18.     leer_fichero(nombre_fichero);
  19. }
  20.  
  21. void leer_fichero(char *nombre)
  22. {
  23.     FILE *F;
  24.    
  25.     if ((F = fopen(nombreFichero, "r")) == NULL)
  26.     {
  27.         printf ("Error en la apertura\n");
  28.         return;
  29.     }
  30.     // Aquí leo el contenido del fichero
  31.     fclose(F);
  32. }

Claro está, el tema de parámetros, declaraciones, etc, tendrás que ponérselo en función del resto de tu programa.