• Sábado 1 de Junio de 2024, 08:13

Autor Tema:  Cargar Archivo  (Leído 2402 veces)

Atreyu

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Cargar Archivo
« en: Lunes 12 de Septiembre de 2005, 20:10 »
0
Wenasss:

Estaba yo guardando y cargando una partida guardada de mi cuatro en raya, pero me da serios problemas a la hora de cargar el archivo guardado (es largo :argh:  pero espero dejarlo bastante claro):

int cargar (char * archivo, Jugprinc * x, Jugadorsec * y)
{
   char afirm;
   int num;
   int i, j;

   FILE * f;

   f = fopen (archivo, "r");

   if (!f)
      return ERROR_ABRE;

   do
   {
      num = fscanf (f, "%s", x->jugada.partida);
      if (num<10)
         return ERROR_ABRE;

/*Estas lineas son basicamente lo mismo que tenia en una unica orden pero separe porque me daban problemas tambien*/

      num = fscanf (f, "%d", x->filas);
      if (num!=1)
         return ERROR_ABRE;

      num = fscanf (f, "%d", x->columnas);
      if (num!=1)
         return ERROR_ABRE;

      num = fscanf (f, "%c", x->jugada.ficha);
      if (num!=1)
         return ERROR_ABRE;

      num = fscanf (f, "%c", y->ficha);
      if (num!=1)
         return ERROR_ABRE;

      num = fscanf (f, "%s", x->jugada.nombre);
      if (num!=1)
         return ERROR_ABRE;

      num = fscanf (f, "%s", y->nombre);
      if (num!=1)
         return ERROR_ABRE;

      num = fscanf (f, "%d", x->jugada.turno);
      if (num!=1)
         return ERROR_ABRE;

      for (i=0; i<x->filas; i++) //Se guarda el tablero que se crearia antes de este bucle
         for (j=0; j<x->columnas; j++)
         {
            num = fscanf (f, "%c", x->tablero[j]);
            if (num != 1)
               return ERROR_CARGA;
         }

      do
      {
         printf ("\n¿Cargar %s? s/n: ", x->jugada.partida);
         scanf ("%c", &afirm);
      }while ( afirm == 's' || afirm =='n');
   }while (afirm == 's');

   return OK;
}


Pues bien, el fallo me lo da al tratar de cargar el segundo dato (x->filas) que da un error de esos tan catastroficos de windows de enviar informe de errores... y con el depurador me da una ventana de error de unhanled expresion... acces violation.

Si os sirve el archivo guardado tiene una pinta tal que asi:

Antonieta
12
21
1
X
adsf
fda
0
(                                                                                                                                                                                                                                        1X1     X           )

Lo que hay entre parentesis es la tabla, ya que la mayoria son casillas en blanco, esta toda escrita sin espacios (igual tambien deberia guardarla como 0 de ASCII y no como espacios).

typedef struct
{
   char nombre [30];
   char ficha;
   int  turno;
   char partida [30];
} Jugadorsec;

typedef struct
{
   Jugadorsec jugada;
   int        filas, columnas;
   char       **tablero;   
} Jugprinc;

Agradeceria cualquier ayuda en este tema. ¿Puedo meter todo el cargado hasta la tabla en una linea como queria al principio o tengo que separarlo como he hecho aqui?

Atreyu

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Cargar Archivo
« Respuesta #1 en: Martes 13 de Septiembre de 2005, 11:58 »
0
Hola de nuevo:

Creo que me he excedido con la pregunta, la voy a resumir e intentar aclarar un poco porque me he dado cuenta que es totalmente intratable:

Al cargar un archivo desde esta función:

int cargar (char * archivo, Jugador * x, Jugadorsec * y)
{
   int num;

   FILE * f;

   f = fopen (archivo, "r");

   if (!f)
      return ERROR_ABRE;

   num = fscanf (f, "%s", x->jugada.partida);
   if (num!=1)
       return ERROR_ABRE;

   num = fscanf (f, "%d", x->filas);
   if (num!=1)
       return ERROR_ABRE;

   num = fscanf (f, "%d", x->columnas);
   if (num!=1)
       return ERROR_ABRE;


   return OK;
}

LLamo a la funcion correctamente y me lee la primera fila de datos del archivo de texto sin ningun problema (la correspindiente a la cadena de caracteres), pero al leer, la segunda linea (x->filas) me da un error al ejecutar el programa. No tengo ni idea a que se debe ni si realmente podría escribir la lectura de datos en un único fscanf en lugar de tener que repetir lo mismo varias veces.

El archivo es "save.txt" y tiene una pinta tal que asi:

Partida
12
21

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Cargar Archivo
« Respuesta #2 en: Martes 13 de Septiembre de 2005, 13:27 »
0
Hola

Tu problema esta aqui

Código: Text
  1.  num = fscanf (f, &#34;%d&#34;, x-&#62;filas); // &#60;---- AQUI debes pasar la direccion de x-&#62;filas
  2. if (num!=1)
  3. return ERROR_ABRE;
  4.  
  5. num = fscanf (f, &#34;%d&#34;, x-&#62;columnas); // &#60;---- Y AQUI debes pasar la direccion de x-&#62;columnas
  6. if (num!=1)
  7. return ERROR_ABRE;
  8.  

El codigo bueno seria:

Código: Text
  1.  num = fscanf (f, &#34;%d&#34;, &x-&#62;filas);
  2. if (num!=1)
  3. return ERROR_ABRE;
  4.  
  5. num = fscanf (f, &#34;%d&#34;, &x-&#62;columnas);
  6. if (num!=1)
  7. return ERROR_ABRE;
  8.  

Creo que eso es lo que estaba mal, espero que te sirva

salu2  :hola:

Atreyu

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Cargar Archivo
« Respuesta #3 en: Martes 13 de Septiembre de 2005, 16:46 »
0
Si, era eso. Ahora me parece la duda un tanto tonta y la solucion demasiado obvia, no me puedo creer que me haya tirado tanto tiempo comiendome la cabeza y dandole vueltas. Muchas gracias.

Tenia otra duda que me ha pasado ya dos veces en este mismo programa: al escanear una variable tipo char del teclado, directamente no deja teclear la letra y automaticamente le da el valor 10 en ASCII, que creo que es el salto de linea. Pero en cambio al escanear la variable siguiente no da ningun problema:

printf ("\nJugador 2 introduzca el caracter que desea que sea su ficha: ");
scanf  ("%c", &jugador2->ficha); // Aqui es donde salta directamente al ejecutar hasta el siguiente scanf dando el valor 10, es del tipo jugadorsec

   
printf ("\nJugador 1 introduzca el caracter que desea que sea su ficha: ");
scanf  ("%c", &jugador1->jugada.ficha); //jugador1 es del tipo jugprinc y si que escanea este
 _________________________________________________________

printf ("\n¿Cargar %s? s/n: ", x->jugada.partida);
scanf ("%c", &afirm); // Aqui me pasa lo mismo y pasa olimpicamente de leer nada de la pantalla (afirm es un char)


Si me resolvierais tambien esta duda por fin podria poner punto y final a mi programa. Muchas gracias.
 Un saludo.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Cargar Archivo
« Respuesta #4 en: Martes 13 de Septiembre de 2005, 17:06 »
0
Hola

No hay de que, y no te preocupes por los fallos, pq casi siempre donde se mete la pata es en las cosas mas simples.A todos nos pasa  ;)  y cuando nos damos cuenta de lo que era nos dan ganas de tirar el ordenador por la ventana :hitcomp:

Aveces, bueno la mayoria de las veces el scanf da problemas con el buffer de entrada y en algunas llamadas recoge la entrada anterior o cosas asi.

Mira a ver si se te arregla poniendo esto antes de la llamada a scanf que te da problemas

Código: Text
  1. fflush(stdin) // lo que hace esta funcion es limpiar el buffer de entrada de teclado stdin
  2.  

Pruebalo a ver que tal.

salu2  :hola:

Atreyu

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Cargar Archivo
« Respuesta #5 en: Martes 13 de Septiembre de 2005, 17:21 »
0
Si, :bravo:  muchisimas gracias otra vez. Esta si que no la hubiera podido resolver yo solo en mucho tiempo. Y tengo otra funcion que añadir a mis apuntes. :gracias:

Atreyu

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Cargar Archivo
« Respuesta #6 en: Martes 13 de Septiembre de 2005, 18:10 »
0
¿No tendra tambien fflush() su equivalente para cargar archivos con fscanf? Tambien me lee basura en un punto de la apertura de archivo. Llevo un buen rato buscando en internet pero no he encontrado nada

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Cargar Archivo
« Respuesta #7 en: Martes 13 de Septiembre de 2005, 18:26 »
0
Pues la verdad no se si existe una funcion especifica para fscanf
Prueba a usar lo mismo fflush(stdin) yo creo que deberia valer tambien para el caso de recoger informacion de un archivo
Si no prueba a usar fflush(); que limpia todos los buffers entrada,salida y errores

salu2  :hola:

Atreyu

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Cargar Archivo
« Respuesta #8 en: Martes 13 de Septiembre de 2005, 19:04 »
0
El caso no es que me lea basura, es que no me lo lee correctamente:

Código: Text
  1.  
  2. num = fscanf (f, &#34;%s&#34;, x-&#62;jugada.partida);
  3. if (!num)
  4.    return ERROR_ABRE;
  5.  
  6. num = fscanf (f, &#34;%c&#34;, &x-&#62;jugada.ficha);//en este esta el problema
  7. if (num!=1)
  8.    return ERROR_ABRE;
  9.  
  10. num = fscanf (f, &#34;%c&#34;, &y-&#62;ficha);
  11. if (num!=1)
  12.   return ERROR_ABRE;
  13.  
  14.  

Este es un error muy extraño: la primera fila que escanea la cadena de caracteres partida la introduje por error al copiar y pegar para experimentar y solucionar los problemas que he tenido, pero cuando la quito, fscanf no devuelve como deberia 1 y me da ERROR_ABRE, si no lo quito me modifica de nuevo el nombre de partida y me desordena la tabla y datos que vienen a continuacion. Es un error muy extraño.

Atreyu

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Cargar Archivo
« Respuesta #9 en: Martes 13 de Septiembre de 2005, 21:03 »
0
Resuelto el ultimo problema. Gracias por toda esta ayuda, Diodo.


Atreyu

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Cargar Archivo
« Respuesta #11 en: Jueves 15 de Septiembre de 2005, 21:01 »
0
Ufff.
Siento haber tardado tanto en responder. En realidad no lo se :blink: . Escaneaba un salto de linea en ese punto y fscanf devolvia 0, con lo que era un fallo del fscanf. Lo que hice fue volvera reescribir todo en una unica linea de scanf mas el bucle de la tabla.
Un saludo.