Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DickGumshoe en 2 Julio 2012, 18:14 pm



Título: Ahorcado con ficheros
Publicado por: DickGumshoe en 2 Julio 2012, 18:14 pm
Hola.

Estoy haciendo el juego del ahorcado.

He creado un fichero "prueba.dat", en el que meto palabras separadas por un espacio. Quiero obtener una palabra aleatoria de entre las que tengo.

Todavía no tengo la parte de obtener la palabra aleatoria, pero eso creo que sé hacerlo. El problema es que quiero meter las palabras antes en una matriz.

El programa compila, pero en un momento determinado (que tengo señalado en el programa) deja de funcionar y dice "Ahorcado.exe dejó de funcionar. Windows está buscando la solución al problema"...


Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. int NumeroEspaciosBlancos(FILE *fp);
  5. void CogerPalabras(FILE *fp, int num);
  6.  
  7. int main(){
  8.  
  9. FILE *fp;
  10. int num;
  11.  
  12. fp=fopen("prueba.dat", "r");
  13.  
  14.    num=NumeroEspaciosBlancos(fp);
  15.  
  16.    CogerPalabras(fp,num);
  17.  
  18.    fclose(fp);
  19.  
  20. system("pause");
  21.  
  22. }
  23.  
  24. int NumeroEspaciosBlancos(FILE *fp){
  25.  
  26.  char c;
  27.  int i=0 ;
  28.  
  29.  while(feof(fp)==0){
  30.  
  31.  c=fgetc(fp);
  32.  
  33.  if(c==' ') i++;
  34.  
  35.  }
  36.    rewind(fp);
  37.    return i;
  38.  
  39. }
  40.  
  41. void CogerPalabras(FILE *fp, int num){ //num es el número de espacios que tiene el fichero
  42.  
  43.     char **M;
  44.     char c;
  45.     int i=0,j=0;
  46.  
  47.     M=(char**)malloc((num+1)*sizeof(char*));
  48.  
  49.     for(j=0;j<num+1;j++){
  50.  
  51.  
  52.       M[j]=(char*)malloc(20*sizeof(char));
  53.  
  54.       j++;
  55.  
  56.  
  57.     }
  58.  
  59.  
  60.     i=0;
  61.     j=0;
  62.  
  63.     while((feof(fp)==0) && (c=fgetc(fp))){  //EN ESTE BUCLE DEJA DE FUNCIONAR EL PROGRAMA
  64.  
  65.     if(c!=' '){
  66.     M[i][j]=c;
  67.     j++;
  68.  
  69.  
  70.     }
  71.  
  72.     if(c==' '){
  73.     i++;
  74.     j=0;
  75.     }
  76.  
  77.     }
  78.  
  79.     rewind(fp);
  80.     i=0;
  81.     j=0;
  82.  
  83.     for(i=0;i<num;i++){
  84.  
  85.          printf("\n");
  86.     for(j=0;j<20;j++){
  87.     printf("%c", M[i][j]);
  88.     }
  89.  
  90.     }
  91. }
  92.  

Gracias.

Saludos.


Título: Re: Ahorcado con ficheros
Publicado por: 0xDani en 2 Julio 2012, 18:21 pm
No he mirado el codigo, pero donde dices que se para, en la condicion del while pones un operador de asignacion, y no creo que genere un valor booleano.

Saludos.



Título: Re: Ahorcado con ficheros
Publicado por: DickGumshoe en 2 Julio 2012, 18:31 pm
He hecho bastantes ejercicios en los que pongo esa condición:

Código
  1. while((feof(fp)==0) && (c=fgetc(fp)))

En la primera de las condiciones, comparo el resultado que me da la función feof() con 0, por lo que van dos iguales. En lo segundo, asigno un valor al carácter c (que se puede poner también dentro de un bucle while, pero aunque lo sacara y lo pusiera dentro de las llaves del while, no funciona de todas maneras), por lo que va un solo igual..

Gracias de todas formas.

Saludos.


Título: Re: Ahorcado con ficheros
Publicado por: 0xDani en 2 Julio 2012, 18:46 pm
Pues no se, yo sigo pensando que si le pones &&, este operador devuelve true si las dos(o mas) expresiones devuelven true, y como te he dicho no creo que la asignacion devuelva un valor booleano, entonces nunca entraria en el bucle. De todas formas, que lo diga alguien mas experto.

Saludos.


Título: Re: Ahorcado con ficheros
Publicado por: DickGumshoe en 2 Julio 2012, 18:47 pm
Pero el problema es que entra en el bucle y por alguna razón se para en algún momento. De todas formas, esa condición la he puesto en varios ejercicios y ha funcionado.

Saludos.


Título: Re: Ahorcado con ficheros
Publicado por: DickGumshoe en 2 Julio 2012, 19:16 pm
Ya lo he solucionado.

Era antes de entrar al bucle en el que se paraba el programa, al reservar memoria dinámica. Ahora he puesto:

Código
  1. M = (char**)malloc(num * sizeof(char*)); //Inicializamos filas
  2.     for(i = 0; i < num+1; i++) M[i] = (char*)malloc(c * sizeof(char)); //Inicializamos columnas
  3.  

Saludos y gracias.


Título: Re: Ahorcado con ficheros
Publicado por: durasno en 2 Julio 2012, 22:08 pm
Citar
no creo que la asignacion devuelva un valor booleano
Hola! acordate que en C cualquier valor distinto de 0 se toma como true por ende lo que se evalua con c=fgetc(fp) es el valor de c, osea el caracter que contiene

Saludos