Ahorcado con ficheros

Iniciado por DickGumshoe, 2 Julio 2012, 18:14 PM

0 Miembros y 1 Visitante están viendo este tema.

DickGumshoe

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"...


#include<stdio.h>
#include<stdlib.h>

int NumeroEspaciosBlancos(FILE *fp);
void CogerPalabras(FILE *fp, int num);

int main(){

FILE *fp;
int num;

fp=fopen("prueba.dat", "r");

   num=NumeroEspaciosBlancos(fp);

   CogerPalabras(fp,num);

   fclose(fp);

system("pause");

}

int NumeroEspaciosBlancos(FILE *fp){

 char c;
 int i=0 ;

 while(feof(fp)==0){

 c=fgetc(fp);

 if(c==' ') i++;

 }
   rewind(fp);
   return i;

}

void CogerPalabras(FILE *fp, int num){ //num es el número de espacios que tiene el fichero

    char **M;
    char c;
    int i=0,j=0;

    M=(char**)malloc((num+1)*sizeof(char*));

    for(j=0;j<num+1;j++){


      M[j]=(char*)malloc(20*sizeof(char));

      j++;


    }


    i=0;
    j=0;

    while((feof(fp)==0) && (c=fgetc(fp))){  //EN ESTE BUCLE DEJA DE FUNCIONAR EL PROGRAMA

    if(c!=' '){
    M[i][j]=c;
    j++;


    }

    if(c==' '){
    i++;
    j=0;
    }

    }

    rewind(fp);
    i=0;
    j=0;

    for(i=0;i<num;i++){

         printf("\n");
    for(j=0;j<20;j++){
    printf("%c", M[i][j]);
    }

    }
}


Gracias.

Saludos.

0xDani

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.

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

DickGumshoe

He hecho bastantes ejercicios en los que pongo esa condición:

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.

0xDani

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.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

DickGumshoe

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.

DickGumshoe

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:


M = (char**)malloc(num * sizeof(char*)); //Inicializamos filas
     for(i = 0; i < num+1; i++) M[i] = (char*)malloc(c * sizeof(char)); //Inicializamos columnas


Saludos y gracias.

durasno

Citarno 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
Ahorrate una pregunta, lee el man