Ayuda con problema en C

Publicado en 'Programación' por Pucpy, 24 Oct 2011.





  1. Pucpy

    Pucpy Miembro maestro

    Registro:
    29 Dic 2010
    Mensajes:
    895
    Likes:
    62




    Hola muchachos, miren necesito ayuda con un problema.
    Tengo un archivo con informacion y esta estructurado de la sgte manera:

    Tres Poligonos
    25 26 78 26 78 98 12 13
    41 26 88 63 74 99 12 11 39 45
    11 22 33 45 78 99
    Escudo de la monarquia Arian
    9 13 45 78 23 11
    7 13 2 8 79 41
    ...
    ...
    ...
    Fin

    Ahora, la explicacion, la primera linea tiene un nombre de una figura geometrica, eso necesito guardarlo, luego siguen lineas con numeros, cada linea representa un poligono, cada linea tiene un numero par de numeros, cada par es un par coordenado, esto tambien necesito guardarlo.
    Esto se repite hasta enocntrar la palabra Fin, que indica que ya no hay mas figuras.
    El numero de figuras, y el numero de poligonos por figura, y el numero de numeros por linea no es conocido.

    Mi problema es, como lo leo? para leer un nombre puedo usar scanf (este valor leido puedo compararlo con Fin para ver si ia acabe), y luego los numeros tambien puedo hacerlo con scanf (o tambien getchar), pero como no se cuantas lineas de numeros tengo, no sabria en donde hacer el otro scanf para leer el otro nombre de la nueva figura.

    En las indicaciones del problema indica que no puedo usar sscanf, sprintf.

    Alguien que me ayude porfa!
     


  2. eduar2083

    eduar2083 Miembro frecuente

    Registro:
    26 Jul 2011
    Mensajes:
    224
    Likes:
    46
    Hola. Es mejor que intentes hacerlo tú mismo y cuando estés atascado en algo posteas tu código y de esa manera algún forero pueda detectar en qué estás fallando y así se aprende más. No obstante, te diré que es sencillo recorrer todos los números sin conocer cuántes filas hay de ellos, o en general sin saber la cantidad que se leerán del archivo.
    En Lenguaje C cuando se lee un archivo, se mueve su apuntador de posición tantas veces como lo requiera la lectura. Imagino que estás trabajando con un archivo de texto, por tanto podemos usar la función fscanf() para leer los enteros provenientes de algún archivo. Dicha función retorna EOF cuando se alcanza el final del mismo.
    Te mostraré un pequeño ejemplo de cómo leer los enteros sin conocer cuántos se leerán.

    Supongamos que nuestro archivo.txt contiene esta data.
    Código:
    25 26 78 26 78 98 12 13
    41 26 88 63 74 99 12 11 39 45
    11 22 33 45 78 99 
    El siguiente programa captura cada uno y los muestra como par de coordenadas:
    Código:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
       FILE *pf;
       char *nameFile = "archivo.txt";
       int num, x, y;
    
       pf = fopen(nameFile, "r");
    
       if (pf == NULL) {
          perror(nameFile);
          return EXIT_FAILURE;
       }
    
       while (fscanf(pf, "%d", &num) != EOF) {
          x = num / 10;
          y = num % 10;
    
          printf("(%d, %d) ", x, y);
          fflush(stdout);
       }
    
       return 0;
    }
    
    Leer la cadenas es sencillo y puedes hacerlo de manera análoga.
    Intenta terminarlo.

    Un saludo.
     
  3. Pucpy

    Pucpy Miembro maestro

    Registro:
    29 Dic 2010
    Mensajes:
    895
    Likes:
    62
    en las indicaciones del problema dice que no puedo usar strtok, strdup, sscanf, sprintf, fopen.

    Hay alguna manera de hacerlo con scanf y getchar? porque esas son las unicas funciones que nos han enseñado para lectura de datos.

    Los datos pueden ser leidos de la consola tambien, no necesariamente de un archivo de textos.
     
    Última edición: 24 Oct 2011
  4. eduar2083

    eduar2083 Miembro frecuente

    Registro:
    26 Jul 2011
    Mensajes:
    224
    Likes:
    46
    Mencionaste que tenías la data en un archivo y para trabajar con dicho archivo debe abrirse con la función fopen si o sí, no hay otra forma a menos que crees tu propia función que aperture el archivo, ello implica programar a nivel ensamblador... en fin...
    Si los número están almacenados en una cadena, la lógica es similar, sólo que ahora se debe recorrer la cadena buscando cada número. No es factible atacar el problema con sólo scanf y getchar, recuerda que ambas leen data del usuario, lo más conveniente en este caso es usar la función strtok que nos devuelve los tokens de una cadena ubicados entre delimitadores que debemos especificar.
    Código:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(void)
    {
       char s1[] = "25 26 78 26 78 98 12 13\n41 26 88 63 74 99 12 11 39 45\n11 22 33 45 78 99";
       char s2[] = " \n\t";
       char *ptr;
    
       printf("%s\n\n", s1);
    
       ptr = strtok(s1, s2);
       printf("%s\n", ptr);
       while((ptr = strtok(NULL, s2 )) != NULL)
         printf("%s\n", ptr);
    
       return EXIT_SUCCESS;
    }
    
    Te recomiendo llevar un curso de C, hay varios y muy buenos en la web, entre ellos tienes al de Gorka Urrutia.
    Un saludo.
     
  5. Pucpy

    Pucpy Miembro maestro

    Registro:
    29 Dic 2010
    Mensajes:
    895
    Likes:
    62
    Se debe poder con getchar y scanf, por algo no estan las indicaciones de que no se usen las cosas que tu estas usando, ademas, ambos si bien piden datos al usuario, tambien puede q lean de un archivo de texto, redireccionando la entrada de datos en la consola al momento de ejecutar el programa, ahi mismo en las indicaciones dice que no se debe usar strtok. Bueno, gracias de todas formas.
     
  6. eduar2083

    eduar2083 Miembro frecuente

    Registro:
    26 Jul 2011
    Mensajes:
    224
    Likes:
    46
    De poder se puede, no he afirmado lo contrario, sólo que quiero decir que es más complicado o más extenso. Pero veo que no te decides si la data procede de archivo, de una cadena o del usuario, debes al menos tener claro el problema que tienes propuesto. Yo no puedo saber cuál es la descripción precisa del problema planteado, ya que en un inicio dijiste que trabajabas con archivo luego dijiste que la data aparecía por consola, luego vuelves a decir que es de archivo.... Sólo te he dado la solución a cómo extraer los números almacenados en un archivo de texto, en una cadena de texto y convertirlos en un par de coordenadas. Si describieras el problema con más detalle o si lo transcribieras tal cual, sería mejor. De igual manera debiste haber intentado resolver el problema para observar qué es lo que tratas de hacer.
    Espero puedas resolverlo con scanf y getchar y si lo consigues me gustaría que postearas tu solución aquí, de esa forma yo también aprendo.

    Un saludo.
     
  7. Pucpy

    Pucpy Miembro maestro

    Registro:
    29 Dic 2010
    Mensajes:
    895
    Likes:
    62
    Si leo de un archivo o de la consola no importa, igual de todas maneras eso puedo decidirlo al momento de ejecutar el programa redireccionando la entrada en la consola.

    E intentado resolver el problema, pero me complico mucho.
    Leo el nombre de la figura con scanf. Luego leo caracter por caracter y voy formando los numeros, hago esto mientras sean numeros, pero el problema que tengo es, cuando lea el primer caracter de la cadena y vea que no es numero, entonces tendre que leer el nombre de la figura con scanf, pero ya lei el primer caracter del nombre, ese es mi problema! :(