Autor
|
Tema: problemilla con estructura y archivo txt (Leído 3,134 veces)
|
MessageBoxA
Desconectado
Mensajes: 229
ayudame a ayudarte
|
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. #include <stdio.h> #include <stdlib.h> #include <string.h> /* Ahora usando el mismo archivo de datos, leer los nombres y crear otro archivo con los nombres ordenados de la forma apellido, primer_nombre y segundo_nombre*/ //Estructura typedef struct { char primer_nombre [45]; char segundo_nombre [45]; char apellido_persona [45]; } datos; //listado de personas void lista_personas(){ int m=0,k=0,z=1,y=0,x=0; //Indicacion de los datos de la estructura FILE *Doc; printf("Ingresar la cantidad de personas que se generara en su lista:\n\n"); scanf("%d",&k); printf("\n\nla cantidad de personas en su lista es de %d.\n\n",k); datos datos_estruct[y]; Doc=fopen("Documento.txt","wb"); for(m=0;m<=k;m++){ printf("\n\nEl I.D Registro de la persona es: %d\n\n",z); printf("Ingrese el Primer nombre de la persona:\n"); scanf("%s",&datos_estruct[y].primer_nombre[x]); printf("\nIngrese el segundo nombre de la persona:\n"); scanf("%s",&datos_estruct[y].segundo_nombre[x]); printf("\nIngrese el apellido de la persona:\n"); scanf("%s",&datos_estruct[y].apellido_persona[x]); x++; y++; z++; } for(m=0;m<k;m++){ fwrite(&datos_estruct[y], sizeof(datos),1,Doc); y++; } fclose(Doc); } //fin listado_personas // Inicio main main(){ lista_personas(); printf("\n\n\nSus datos fueron guardados satisfactoriamente.\n\n\n"); system("pause"); }
|
|
|
En línea
|
SI LA MATRIX FUERA PERFECTA.... ESTARÍA ESCRITA EN C++
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
int m=0,k=0,z=1,y=0,x=0; //... 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: printf("Ingrese el Primer nombre de la persona:\n"); scanf("%s",&datos_estruct [y ]. primer_nombre); printf("\nIngrese el segundo nombre de la persona:\n"); scanf("%s",&datos_estruct [y ]. segundo_nombre); printf("\nIngrese el apellido de la persona:\n"); 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
Mensajes: 229
ayudame a ayudarte
|
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
Mensajes: 229
ayudame a ayudarte
|
ya lo arregle e hice unas modificaciones. dejo el codigo para que si ven que tiene algun bugs escondido me lo hagan saber. gracias!! #include <stdio.h> #include <stdlib.h> #include <string.h> struct datos { char primer_nombre [45]; char segundo_nombre [45]; char apellido_persona [45]; }; void lista_personas() { printf("Ingresar la cantidad de personas que se generara en su lista: "); int k=0; scanf("%d",&k); printf("\n\nla cantidad de personas en su lista es de %d: ",k); datos datos_estruct[k]; for( int m=0;m<k;m++) { printf("\n\nEl I.D Registro de la persona es: %d\n\n",m+1); printf("Ingrese el Primer nombre de la persona:\n"); scanf("%s",&datos_estruct[m].primer_nombre); printf("\nIngrese el segundo nombre de la persona:\n"); scanf("%s",&datos_estruct[m].segundo_nombre); printf("\nIngrese el apellido de la persona:\n"); scanf("%s",&datos_estruct[m].apellido_persona); } FILE *Doc; Doc=fopen("Documento.txt","w"); if (Doc!= NULL) //2 Se abre para escritura { for(int m=0;m<k;m++) { fprintf(Doc, "%s " , &datos_estruct[m].apellido_persona); fprintf(Doc, "%s " , &datos_estruct[m].primer_nombre); fprintf(Doc, "%s \n" , &datos_estruct[m].segundo_nombre); } } else{ exit(0); } fclose(Doc); //fin listado_personas } // Inicio main main(){ lista_personas(); printf("\n\n\nSus datos fueron guardados satisfactoriamente.\n\n\n"); system("pause"); }
|
|
|
En línea
|
SI LA MATRIX FUERA PERFECTA.... ESTARÍA ESCRITA EN C++
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
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
Mensajes: 1.639
|
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: int k=0; /* 1 */
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: /* ... */ 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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Ayuda con metodos de un archivo (estructura de datos)
Programación General
|
crifesma
|
0
|
2,003
|
3 Junio 2011, 03:02 am
por crifesma
|
|
|
Castear estructura en un archivo.c distinto al main
Programación C/C++
|
Fabi0lo
|
3
|
2,730
|
20 Noviembre 2012, 23:29 pm
por rir3760
|
|
|
Descifrar estructura de archivo con formato propietario
Ingeniería Inversa
|
marceloarguello700
|
2
|
2,367
|
19 Agosto 2014, 18:39 pm
por marceloarguello700
|
|
|
Grabar estructura en archivo [lenguaje C] [Windows 7]
« 1 2 »
Programación C/C++
|
DanielPy
|
12
|
6,239
|
14 Marzo 2015, 04:25 am
por rir3760
|
|
|
Leer archivo txt y validar estructura
.NET (C#, VB.NET, ASP)
|
elqueteconte
|
2
|
6,801
|
25 Febrero 2016, 14:52 pm
por elqueteconte
|
|