Programa Loteria

Iniciado por mortaz, 14 Enero 2013, 21:27 PM

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

mortaz

Viendo nuestro programa nos podrías poner como harías tu el procedimiento buscar, porque a mi me da un bucle infinito y violación del segmento al final, creo que tengo mal hecho el do-while, con esto tendría completo el programa así que estaría muy agradecido si me lo pudieras decir.

durasno

Citarviolación del segmento
este error se debe seguro a un mal uso de los arreglos...

CitarViendo nuestro programa nos podrías poner como harías tu el procedimiento buscar
solo modificando las cosas q te marque deberia andar:
void buscar(struct fnum elegido[TAM], char *fichero1, char *fichero2, char *fichero3) { //para buscar los numeros en fichnumeros
        struct cadenacar categoria[TAM];
        char lugar[30];
        int i, x;
        int seguir;
        int numero, serie;
        struct registro registro;
        FILE *result; /* result apunta a "result.dat"*/
        FILE *fich;   // fich apunta a "fichnumerosCompletos.dat"
        FILE *premiotxt;  // premiostxt apunta a "premios.txt"

     /* Apertura en modo lectura-escritura. */
     fich = fopen("fichnumerosCompleto.dat", "r");
     result = fopen("result.dat", "wr");
     premiotxt = fopen("premios.txt", "w");

        if (result != NULL && fich !=NULL && premiotxt !=NULL);{ /*Comprobación*/

        seguir = 1;
            do {
                fread(&registro, sizeof(struct registro), 1, fich);
                for(i =0; i<TAM; i++){
                if ((elegido[i].numero == registro.billete.numero) && (elegido[i].serie == registro.billete.serie)) {
                  //almacena lugar
                        fprintf(result, "%d\t %d\t %s\n",registro.billete.numero, registro.billete.serie,registro.lugar);
                        numero = registro.billete.numero;
                        serie  = registro.billete.serie;
                        strcpy(lugar,registro.lugar);
                        seguir = 0;
                        break; // este break es para que no continue con el for, ya que se encontro el registro
                        }
                  }
                }while (!feof(fich) && (seguir==1));
        fclose(fich);
        fclose(result);
        }
/* ...........*/

la otra mitad de buscar() te toca a vos ya que es parte de la logica del programa, ese es tu trabajo

Otra cosa fijate que en el main tambien tenes errores con los arreglos, por ejemplo en:
  for (i=0; i< TAM; i++){
     premios.numero = azar_numero(intervnum)%9999 +1;
     premios.serie = azar_serie(intervserie);


SAludos
Ahorrate una pregunta, lee el man

flony

a modo  de ayuda para la función buscar
Citar[ inicio
Función fopen:Esta función sirve para abrir y crear ficheros en disco
Función fscanf:La función fscanf funciona igual que scanf en cuanto a parámetros, pero la entrada se toma de un fichero en lugar del teclado.
Función feof:Esta función sirve para comprobar si se ha alcanzado el final del fichero
Función fclose:Es importante cerrar los ficheros abiertos antes de abandonar la aplicación
fin ]
usar la función fscanf aquí la doc y dos pagina que tiene ejemplos, la función fscanf estaría dentro de un while para que leea todos los renglones, como veras en el ejemplo mucho depende de como sea el archivo que uno lee, podrías poner aunque mas no sea una parte del archivo (fichnumeros.dat)
documentacion :http://www.cplusplus.com/reference/cstdio/fscanf/
ejemplo :http://people.ac.upc.edu/careglio/old/IO/miscellaneous/guides/FormatosScanf.txt
http://www.esdebian.org/foro/3868/c-leer-linea-fichero-fscanf
si un problema no tiene solucion entonces no es un problema...es algo inevitable

durasno

A pesar de que en la apertura del archivo no aclara el modo "b"(binario), lo mas probable es que este no contenga formato ya que utiliza funciones como fwrite y fread(fscanf en este caso no funcionario)



Saludos
Ahorrate una pregunta, lee el man

mortaz

esta precticamente todo, me imprime en el fichero result, me imprime en el fichero premios.txt y me lee el premios txt pero me queda que me imprima eso ultimo leido me lo imprima de la forma:
Primer premio: 949 8 Sin vender
Segundo premio: 5354 2 Lugo
etc que lo que me hace ahora es imprimirmelo todo seguido. Está de la seguiente manera:

void leerymostrarficherotxt(char *fichtxt){
        FILE *premiotxt;
        char lugar[91];
        //Abrir fichero para lectura de los numeros
     if ((premiotxt = fopen(fichtxt, "r")) == NULL){
        //Si no puede abrise o no existe.
        printf("El fichero '%s' no se puede leer", fichtxt);
        }
     else printf("\n    NUMEROS DE PREMIADOS:\n");
         fscanf (premiotxt,"%s", lugar);
        //Muestra datos por pantalla
        while ( !feof(premiotxt)){                      //Mientras no ha llegado a la marca de fin de fichero lee linea a linea
          printf("%s\t", lugar);                  //Escribe una de las lineas en la pantalla.
          fscanf(premiotxt, "%s", lugar);      //Lee siguiente linea hasta fin de linea o un maximo de 90 caracteres.
                      }
     fclose (premiotxt);
        }



void ponersinvender(char *fichtxt){
        FILE *premiosinvend;
        char lugar[91];

        if ((premiosinvend = fopen(fichtxt, "r")) == NULL){
          //Si no puede abrise o no existe.
           printf("El fichero '%s' no se puede leer", fichtxt);}
        else {printf("\nPremios que no se han vendido:\n");
                fscanf(premiosinvend, "%s", lugar);

          //Muestra datos por pantalla
              while ( !feof(premiosinvend)){                      //Mientras no ha llegado a la marca de fin de fichero lee linea a l$
                if (strstr (lugar, "Sin vender")){     //Si la cadena de busqueda esta incluida en dato
                  printf("%s", lugar);}
                 fscanf(premiosinvend, "%s", lugar);       //Lee la siguiente linea del fichero.
                }
        fclose(premiosinvend);
   }}

si podeis echarle un ojo al de mostrar sin vender que no muestra tambien estaria bien ;) gracias

durasno

La verdad no entiendo bien cual es el problema, trata de detallar mas

Pregunta: las dos funciones abren distintos archivos??


Saludos

PD: cuando escribis codigo, arriba a la derecha hay algo que dice GeSHi, elegi donde dice C y pone el codigo dentro de [ code=c ] /* aca va codigo*/[ /code ]... El moderador te lo advirtio, si se lo toma mal por ahi te cierra el post xD
Ahorrate una pregunta, lee el man

mortaz

Mi fallo esta en la forma de leer el txt, me lee una palabra por bucle, cuando yo quiero leer la línea completa para que así cuando compare con "Sin vender" encuentre coincidencias. Porque ahora lee una sola palabra por bucle y no da ninguna coincidencia porque compara un solo espacio del lugar (sin o vender) con sin vender, y claro, no lo encuentra. Gracias

durasno

fscanf al igual que scanf lee hasta encontrar un blanco(espacio, tabulacion, salto de linea), si queres leer una linea entera tenes la funcion fgets. Pero si tu archivo tiene un formato especifico tambien podes usar fscanf; por ejemplo si el archivo es del tipo:

"123   8   Leo"
"456   2   mortaz"


podes usar algo como:
fscanf(file,"%d %d %s",var1,var2,str);


Saludos
Ahorrate una pregunta, lee el man

flony

#18
haber si entendi elprobema ...me dan un archivo ficnumero.dat donde solo estan los billetes vendidos, genero numero ganador , me fijo del archivo si esta, si esta lo agrego a archivo premio.txt y lo anoto en registro, si no esta genero otro, ...asi 30 veces evidentemente del mismo archivo obtengo los vendidos o no .......por eso decia que la funcion fscanf me parecia lo ideal, como sabran las busqueda sera distinta en base a como esten anotado lo numeros vendidos
02 2154
03 2152
10 2154
o
022154
032152
102154
si un problema no tiene solucion entonces no es un problema...es algo inevitable