elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Solucionado]Imposible mostrar texto de un txt en C -
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Solucionado]Imposible mostrar texto de un txt en C -  (Leído 1,757 veces)
Arturo400

Desconectado Desconectado

Mensajes: 6


Ver Perfil
[Solucionado]Imposible mostrar texto de un txt en C -
« en: 25 Septiembre 2016, 00:10 am »

Hola

Tengo un programa en el cual tengo que crear un nuevo tipo de dato struct en el cual voy a tener 3 variables, una que es el documento de la persona, la otra es el nombre de la persona y por ultimo la nacionalidad de la persona.

Al principio lo que tengo que hacer es cargar manualmente el nuevo tipo de dato, la carga va a finalizar cuando el documento sea igual a 0.

Luego va a pasar todo lo cargado a un archivo txt. (Hasta aca, va perfecto todo ;-))

El problema surge cuando tengo que leer el archivo e imprimir el contenido . Lo que sucede es que cuando pongo while(!feof(fd)) la lectura del archivo no termina nunca, siempre me arroja los mismos valores, nunca termina el ciclo y ademas nunca me carga la nacionalidad.

El archivo se va a cargar de la siguiente manera.

38747443,Agustin,Argentina

Es decir que en cada linea del archivo txt voy a tener ese tipo de secuencia.

Este es el codigo que hice

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #define N 5
  5.  
  6. struct s_datos
  7. {
  8.    int doc;
  9.    char nombre[50];
  10.    char pais[50];
  11.  
  12. };
  13. typedef struct s_datos dato;
  14.  
  15. int CARGA(dato charge[N]);
  16. void CREACION(dato charge[N],int);
  17. void IMPRESION();
  18.  
  19. int main()
  20. {
  21.    int i=0,j=0;
  22.    dato charge[N];
  23.    i=CARGA(charge);  /// i es la cantidad de personas que tengo.
  24.    printf("\nEl valor de i es %d",i);
  25.    for (j=0;j<i;j++)
  26.    {
  27.        printf("\n%d",charge[j].doc);
  28.        printf("\n%s",charge[j].nombre);
  29.        printf("\n%s",charge[j].pais);
  30.    }
  31. CREACION(charge,i);  ///Llamo a la funcion para crear un txt y le paso el nuevo dato struct y la cantidad de personas ingreadas.
  32. printf("\n");
  33. IMPRESION();
  34.  
  35.  
  36.  
  37.    return 0;
  38. }
  39.  
  40. int CARGA(dato charge[N])
  41. {
  42.   int i=0,j=0,e=0;
  43.   char letra='a';
  44.   charge[i].doc=4;
  45.   while (i<N)
  46.   {
  47.       printf("\nIngrese el numero de documento: ");
  48.       scanf("%d",&charge[i].doc);
  49.           if (charge[i].doc!=0)
  50.           {
  51.               printf("\nIngrese el nombre: ");
  52.  
  53.                   while(letra!='\r')
  54.                   {
  55.                      letra=getche();
  56.                      charge[i].nombre[j]=letra;
  57.                      j++;
  58.                   }
  59.                   charge[i].nombre[j]='\0';
  60.               j=0;
  61.               letra='a';
  62.  
  63.               printf("\nIngrese el pais: ");
  64.  
  65.                   while(letra!='\r')
  66.                   {
  67.                      letra=getche();
  68.                      charge[i].pais[e]=letra;
  69.                      e++;
  70.                   }
  71.                   charge[i].pais[e]='\0';
  72.                   e=0;
  73.               letra='a';
  74.               i++;
  75.           }
  76.       if(charge[i].doc==0)
  77.       {
  78.           return i;
  79.       }
  80.   }
  81.   return i;
  82.  
  83. }
  84.  
  85. void CREACION(dato charge[N],int i)
  86. {
  87.    FILE*arch;
  88.    arch=fopen("C:\\Users\\Pablo-PC\\Desktop\\personas.txt","w");
  89.    int j=0;
  90.    while(j<i)
  91.    {
  92.        fprintf(arch,"%d,%s,%s\n",charge[j].doc,charge[j].nombre,charge[j].pais);
  93.        j++;
  94.    }
  95.    fclose(arch);
  96. }
  97.  
  98. void IMPRESION()
  99. {
  100.    FILE*fd;
  101.  
  102.    int doc,i=0;
  103.    char nombre[50]={0},pais[50]={0};
  104.  
  105.    fd=fopen("C:\\Users\\Pablo-PC\\Desktop\\personas.txt","r");
  106.  
  107.    printf("Documento\tNombre\tPais\n");
  108.    fscanf(fd,"%d,%s,%s\n",&doc,&nombre,&pais);
  109.    while(!feof(fd) && i<4)
  110.    {
  111.        printf("%d\t%s\t%s\n",doc,nombre,pais);
  112.        fscanf(fd,"%d,%s,%s\n",&doc,&nombre,&pais);
  113.        i++;
  114.    }
  115.    fclose(fd);
  116. }
  117.  
  118.  

La funcion que funciona mal es IMPRESION y no le veo defecto alguno.


« Última modificación: 26 Septiembre 2016, 03:39 am por Arturo400 » En línea

dato000


Desconectado Desconectado

Mensajes: 3.033



Ver Perfil
Re: Imposible mostrar texto de un txt en C - Tengo un error y nose cual es
« Respuesta #1 en: 25 Septiembre 2016, 02:47 am »

Reemplaza la función IMPRESION con lo siguiente:

Código
  1. FILE *fd;
  2.  
  3.    int documento;
  4.    char nombre[50],pais[50];
  5.  
  6.    fd=fopen("C:\\Users\\Pablo-PC\\Desktop\\personas.txt","r");
  7.  
  8.    printf("Documento\tNombre\tPais\n");
  9.  
  10.    while(fscanf(fd,"%d %s %s\n",&documento, &nombre, &pais) == 3)
  11.    {
  12.        printf("%d\t\t%s\t%s\n",documento,nombre,pais);
  13.    }
  14.    fclose(fd);
  15.  

Al parecer el problema de que no leyera todas las columnas era las comas en el fscanf, las cuales no deben ser utilizadas en un procedimiento de lectura o input pues provocaria volcamiento de memoria.

Y respecto a que solo quedaba en una sola linea dentro del while, es que no se que carajos era ese tipo de ciclo, solo era mandarle el archivo, y en estos casos, el mismo ciclo sabe cuando ha terminado el mismo, por lo que solo es necesario determinarle que tipo de parametros leer, y en que orden imprimirlos.

Fuente:

http://stackoverflow.com/questions/14199155/reading-in-c-using-fscanf-multiple-values


En línea


Arturo400

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Imposible mostrar texto de un txt en C - Tengo un error y nose cual es
« Respuesta #2 en: 25 Septiembre 2016, 03:44 am »

Hola

Pero en ese caso me imprimiria con las comas incluidas en cada columna, como hago para que no me tome las comas?.
En línea

dato000


Desconectado Desconectado

Mensajes: 3.033



Ver Perfil
Re: Imposible mostrar texto de un txt en C - Tengo un error y nose cual es
« Respuesta #3 en: 25 Septiembre 2016, 04:21 am »

Hola

Pero en ese caso me imprimiria con las comas incluidas en cada columna, como hago para que no me tome las comas?.

Una forma seria simplemente borrar las comas en el archivo.

Otra forma seria validar caracter por caracter que solo se imprima con la condición que NO sea un caracter coma.
En línea


MAFUS


Desconectado Desconectado

Mensajes: 1.533



Ver Perfil
Re: Imposible mostrar texto de un txt en C - Tengo un error y nose cual es
« Respuesta #4 en: 25 Septiembre 2016, 20:15 pm »

Muy buenas. Para solucionar tu problema con las comas puedes hacer uso de una funcionalidad un poco más avanzada de fscanf. Impresión queda así:
Código:
void IMPRESION()
{
    FILE*fd;
 
    int doc,i=0;
    char nombre[50]={0},pais[50]={0};
 
    fd=fopen("C:\\Users\\Pablo-PC\\Desktop\\personas.txt","r");
 
    printf("Documento\tNombre\tPais\n");
    fscanf(fd,"%d,%[^,],%[^\n]",&doc,nombre,pais);
    while(!feof(fd) && i<N)
    {
        printf("%d,%s,%s\n",doc,nombre,pais);
        fscanf(fd,"%d,%[^,],%[^\n]",&doc,nombre,pais);
        i++;
    }
    fclose(fd);
}

La cadenade control de fscanf ha cambiado un poco.
Tu idea de usar comas separadoras está bien, pues es el mismo formato que scanf va a recibir y va a desechar esas comas. El problema venía que recogías tanto nombre como país con el argumento %s que coge toda la cadena hasta que haya un espacio en blanco (tabulación, nueva línea, etc.) por lo que también te pillaba la coma.
Sin embargo haciendo uso de %[^,] le dices a fscanf: guarda la cadena hasta que encuentres el caracter coma (los corchetes indican los caracteres que debe recoger fscanf, el acento circunflejo al principio indica negación, es decir, que se debe recoger todos los caracteres hasta encontrar uno de esa lista). Así que capturarás toda la cadena hasta que llegues a la coma.
Después te encuentras la coma que vas a desechar y empieza otra captura de cadena hasta que llegue al final de ésta, el caracter de nueva línea, como marca %[^\n].
En línea

Arturo400

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Imposible mostrar texto de un txt en C - Tengo un error y nose cual es
« Respuesta #5 en: 25 Septiembre 2016, 21:45 pm »

Muy buenas. Para solucionar tu problema con las comas puedes hacer uso de una funcionalidad un poco más avanzada de fscanf. Impresión queda así:
Código:
void IMPRESION()
{
    FILE*fd;
 
    int doc,i=0;
    char nombre[50]={0},pais[50]={0};
 
    fd=fopen("C:\\Users\\Pablo-PC\\Desktop\\personas.txt","r");
 
    printf("Documento\tNombre\tPais\n");
    fscanf(fd,"%d,%[^,],%[^\n]",&doc,nombre,pais);
    while(!feof(fd) && i<N)
    {
        printf("%d,%s,%s\n",doc,nombre,pais);
        fscanf(fd,"%d,%[^,],%[^\n]",&doc,nombre,pais);
        i++;
    }
    fclose(fd);
}

La cadenade control de fscanf ha cambiado un poco.
Tu idea de usar comas separadoras está bien, pues es el mismo formato que scanf va a recibir y va a desechar esas comas. El problema venía que recogías tanto nombre como país con el argumento %s que coge toda la cadena hasta que haya un espacio en blanco (tabulación, nueva línea, etc.) por lo que también te pillaba la coma.
Sin embargo haciendo uso de %[^,] le dices a fscanf: guarda la cadena hasta que encuentres el caracter coma (los corchetes indican los caracteres que debe recoger fscanf, el acento circunflejo al principio indica negación, es decir, que se debe recoger todos los caracteres hasta encontrar uno de esa lista). Así que capturarás toda la cadena hasta que llegues a la coma.
Después te encuentras la coma que vas a desechar y empieza otra captura de cadena hasta que llegue al final de ésta, el caracter de nueva línea, como marca %[^\n].

Wow, no sabia que se podia hacer eso!. Ahora si lee todo. Te hago una ultima consulta. Como puedo hacer para que me quede la impresion de manera ordenada?.
Porque supongamos que los datos del txt son asi:

39581882,agustin,francia
39149112,Ricardo Lopez,Argentina
41959129,Agustin,Grecia.

Entonces cuando quiero imprimir me queda un poco descordinado la parte de paises y nombres y no me queda del todo prolijo, con los \t no lo pude solucionar
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.533



Ver Perfil
Re: Imposible mostrar texto de un txt en C - Tengo un error y nose cual es
« Respuesta #6 en: 26 Septiembre 2016, 00:04 am »

Al igual que scanf, printf tiene su técnica avanzada para formatear el texto.
Verás:
%s sabes que escribe una cadena.
%Ns siendo N un número entero constante hace que la cadena tenga como mínimo N caracteres y se alinee por la derecha. Si la cadena es más corta de lo que marca N los caracteres que faltan se rellenan con espacios.

%-Ns siendo N un número entero constante hace que la cadena tenga como mínimo N caracteres y se alinee por la izquierda. Si la cadena es más corta de lo que marca N los caracteres que faltan se rellenan con espacios.

%.Ms siendo M un número entero constante hace que se tomen de la cadena los M primero caracteres a escribir descartando los demás.

Por supuesto las dos formas se pueden mezclar:
%N.Ms
%-N.Ms

Ejemplos serían:
%5s
%-5s
%10.6s
%-10.6s

scanf y printf tienen aún muchas más opciones avanzadas. Te animo a que busques por internet su documentación y juegues con estas dos funciones. Puedes llegar a hacer muchas cosas con ellas.

Para que juegues con printf y después lo apliques en tu programa te dejo un ejemplo muy sencillo:
Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.    printf("|%15.5s|", "Mi_cadena");
  5.  
  6.    return 0;
  7. }
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Mostrar texto en columna?
Programación Visual Basic
LeandroA 2 1,414 Último mensaje 27 Agosto 2008, 00:47 am
por LeandroA
imposible comparar texto :S
Programación Visual Basic
CAR3S? 6 1,784 Último mensaje 23 Diciembre 2010, 12:37 pm
por 79137913
Duda: Como convertir texto a texto grande para mostrar en la consola.
Dudas Generales
zinfinal 4 2,310 Último mensaje 23 Abril 2014, 18:32 pm
por Pablo Videla
Leer puerto serie y mostrar texto en cuadro de texto
Java
Meta 0 2,372 Último mensaje 6 Marzo 2015, 21:33 pm
por Meta
Algunas veces el texto en Ubuntu es imposible de leer!!
GNU/Linux
Agente Naranja 2 1,571 Último mensaje 22 Julio 2020, 04:52 am
por Agente Naranja
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines