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

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  problemilla con estructura y archivo txt
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: problemilla con estructura y archivo txt  (Leído 3,129 veces)
MessageBoxA

Desconectado Desconectado

Mensajes: 229


ayudame a ayudarte


Ver Perfil WWW
problemilla con estructura y archivo txt
« 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. }


En línea

SI LA MATRIX FUERA PERFECTA.... ESTARÍA ESCRITA EN C++
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: problemilla con estructura y archivo txt
« Respuesta #1 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.


En línea

MessageBoxA

Desconectado Desconectado

Mensajes: 229


ayudame a ayudarte


Ver Perfil WWW
Re: problemilla con estructura y archivo txt
« Respuesta #2 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.
En línea

SI LA MATRIX FUERA PERFECTA.... ESTARÍA ESCRITA EN C++
MessageBoxA

Desconectado Desconectado

Mensajes: 229


ayudame a ayudarte


Ver Perfil WWW
Re: problemilla con estructura y archivo txt
« Respuesta #3 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. }
En línea

SI LA MATRIX FUERA PERFECTA.... ESTARÍA ESCRITA EN C++
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: problemilla con estructura y archivo txt
« Respuesta #4 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.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: problemilla con estructura y archivo txt
« Respuesta #5 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines