Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: MessageBoxA en 9 Junio 2014, 23:12 pm



Título: problemilla con estructura y archivo txt
Publicado por: MessageBoxA en 9 Junio 2014, 23:12 pm
saludos a todos, me encuentro un proyecto universitario y e realizado un codigo en base a lo que hemos estudiado de leer nombres y apellidos guardarlos en una estructura y luego guardarlos en un archivo txt pero tengo un problema que no me guarda bien los datos en el archivo de texto. pido de su ayuda y puedan decirme en que fallo y que debo cambiar. de antemano muchas gracias.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. /* Ahora usando el mismo archivo de datos,
  6. leer los nombres y crear otro archivo con
  7. los nombres ordenados de la forma apellido, primer_nombre y segundo_nombre*/
  8.  
  9. //Estructura
  10.  
  11. typedef struct {
  12.  
  13.    char primer_nombre [45];
  14.    char segundo_nombre [45];
  15.    char apellido_persona [45];
  16.  
  17. } datos;
  18.  
  19. //listado de personas
  20. void lista_personas(){
  21. int m=0,k=0,z=1,y=0,x=0;
  22.  
  23. //Indicacion de los datos de la estructura
  24.  
  25. FILE *Doc;
  26.  
  27. printf("Ingresar la cantidad de personas que se generara en su lista:\n\n"); scanf("%d",&k);
  28. printf("\n\nla cantidad de personas en su lista es de %d.\n\n",k);
  29.  
  30. datos datos_estruct[y];
  31.  
  32. Doc=fopen("Documento.txt","wb");
  33.  
  34. for(m=0;m<=k;m++){
  35.          printf("\n\nEl I.D Registro de la persona es: %d\n\n",z);
  36.          printf("Ingrese el Primer nombre de la persona:\n");
  37.          scanf("%s",&datos_estruct[y].primer_nombre[x]);
  38.          printf("\nIngrese el segundo nombre de la persona:\n");
  39.          scanf("%s",&datos_estruct[y].segundo_nombre[x]);
  40.          printf("\nIngrese el apellido de la persona:\n");
  41.           scanf("%s",&datos_estruct[y].apellido_persona[x]);
  42.          x++;
  43.          y++;
  44.          z++;                
  45. }
  46.  
  47. for(m=0;m<k;m++){
  48. fwrite(&datos_estruct[y], sizeof(datos),1,Doc);
  49. y++;
  50. }
  51.  
  52. fclose(Doc);
  53.  
  54.  
  55. }       //fin listado_personas
  56.  
  57.  
  58. // Inicio main
  59. main(){
  60.  
  61.  
  62. lista_personas();
  63. printf("\n\n\nSus datos fueron guardados satisfactoriamente.\n\n\n");
  64.  
  65. system("pause");      
  66. }


Título: Re: problemilla con estructura y archivo txt
Publicado por: eferion en 9 Junio 2014, 23:24 pm
Código
  1. int m=0,k=0,z=1,y=0,x=0;
  2.  
  3. //...
  4.  
  5. datos datos_estruct[y]

si te das cuenta, "y" tiene valor 0, todo lo que suceda después está mal.

Si utilizas nombres que aporten información acerca de su uso habrías visto este error sin problemas.

Además, la forma correcta de almacenar los datos en el array es:

Código
  1. printf("Ingrese el Primer nombre de la persona:\n");
  2. scanf("%s",&datos_estruct[y].primer_nombre);
  3. printf("\nIngrese el segundo nombre de la persona:\n");
  4. scanf("%s",&datos_estruct[y].segundo_nombre);
  5. printf("\nIngrese el apellido de la persona:\n");
  6. scanf("%s",&datos_estruct[y].apellido_persona);

PD.: aprender a usar el depurador no está de más, es un gran aliado y merece la pena perder algo de tiempo en comprender su funcionamiento.


Título: Re: problemilla con estructura y archivo txt
Publicado por: MessageBoxA en 9 Junio 2014, 23:40 pm
yo le doy a utilizar el depurador de Orwell devcpp pero ni no me dice nada de errores :$, hare la sugerencia que me diste y luego si tengo otro problema lo dire.


Título: Re: problemilla con estructura y archivo txt
Publicado por: MessageBoxA en 10 Junio 2014, 04:06 am
ya lo arregle e hice unas modificaciones. dejo el codigo para que si ven que tiene algun bugs escondido me lo hagan saber. gracias!!

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct datos {
  6.  
  7.    char primer_nombre [45];
  8.    char segundo_nombre [45];
  9.    char apellido_persona [45];
  10.  
  11. };
  12.  
  13.  
  14. void lista_personas()
  15.  
  16. {
  17.  
  18. printf("Ingresar la cantidad de personas que se generara en su lista: ");
  19.  
  20. int k=0;
  21.  
  22. scanf("%d",&k);
  23.  
  24. printf("\n\nla cantidad de personas en su lista es de %d: ",k);
  25.  
  26. datos datos_estruct[k];
  27.  
  28. for( int m=0;m<k;m++)
  29.  
  30. {
  31.  
  32.          printf("\n\nEl I.D Registro de la persona es: %d\n\n",m+1);
  33.          printf("Ingrese el Primer nombre de la persona:\n");
  34.          scanf("%s",&datos_estruct[m].primer_nombre);
  35.          printf("\nIngrese el segundo nombre de la persona:\n");
  36.          scanf("%s",&datos_estruct[m].segundo_nombre);
  37.          printf("\nIngrese el apellido de la persona:\n");
  38.           scanf("%s",&datos_estruct[m].apellido_persona);              
  39. }
  40.  
  41.  
  42. FILE *Doc;
  43. Doc=fopen("Documento.txt","w");
  44.  
  45. if (Doc!= NULL) //2 Se abre para escritura
  46. {
  47. for(int m=0;m<k;m++)
  48. {
  49. fprintf(Doc, "%s  " , &datos_estruct[m].apellido_persona);
  50. fprintf(Doc, "%s  " , &datos_estruct[m].primer_nombre);
  51. fprintf(Doc, "%s  \n" , &datos_estruct[m].segundo_nombre);
  52. }
  53. }
  54. else{
  55. exit(0);
  56. }
  57.  
  58. fclose(Doc);
  59.       //fin listado_personas
  60. }
  61.  
  62. // Inicio main
  63. main(){
  64.  
  65.  
  66. lista_personas();
  67. printf("\n\n\nSus datos fueron guardados satisfactoriamente.\n\n\n");
  68.  
  69. system("pause");      
  70. }


Título: Re: problemilla con estructura y archivo txt
Publicado por: eferion en 10 Junio 2014, 08:28 am
yo le doy a utilizar el depurador de Orwell devcpp pero ni no me dice nada de errores :$, hare la sugerencia que me diste y luego si tengo otro problema lo dire.

El depurador no te va a decir "aquí hay un error". El depurador te permite seguir la traza de la ejecución del programa mientras te permite evaluar las variables de la aplicación. Con esta información eres tú el que debería saber qué valores espera en las variables y si coinciden con lo que hay realmente... si no coincide hay algo raro y toca comprobar el código de ese punto para atrás para dar con el fallo.


Título: Re: problemilla con estructura y archivo txt
Publicado por: rir3760 en 10 Junio 2014, 17:40 pm
hice unas modificaciones. dejo el codigo para que si ven que tiene algun bugs escondido me lo hagan saber.
Hay algunas partes que se pueden mejorar.

* No tiene caso almacenar dos valores de forma consecutiva en una variable, la primera asignacion (para ser preciso inicializacion) sobra:
Código
  1. int k=0; /* 1 */
  2.  
  3. scanf("%d",&k); /* 2 */
En su lugar hay que verificar que la lectura sea exitosa (mediante el valor de retorno de la funcion) y que el numero este en el rango valido.

* Declarar un array cuyo numero de elementos se calcula en tiempo de ejecucion:
Código
  1. scanf("%d",&k);
  2.  
  3. /* ... */
  4.  
  5. datos datos_estruct[k];
Solo esta garantizado en el estandar C99, una opcion sin ese problema es el uso de malloc para reservar el bloque de memoria.

* Ya que todos los campos de la estructura son arrays de caracteres no es necesario utilizar el operador "direccion de" (el '&') en las llamadas a scanf y fprintf.

* scanf con el especificador "%s" tiene el mismo problema que gets (no se limita la lectura de caracteres) en su lugar es mejor utilizar fgets o scanf con "%Ns" donde "N" es la capacidad del array de caracteres (menos uno).

Un saludo