problemilla con estructura y archivo txt

Iniciado por MessageBoxA, 9 Junio 2014, 23:12 PM

0 Miembros y 1 Visitante están viendo este tema.

MessageBoxA

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 (cpp) [Seleccionar]
#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");       
}
SI LA MATRIX FUERA PERFECTA.... ESTARÍA ESCRITA EN C++

eferion


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.

MessageBoxA

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.
SI LA MATRIX FUERA PERFECTA.... ESTARÍA ESCRITA EN C++

MessageBoxA

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 (cpp) [Seleccionar]
#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");       
}
SI LA MATRIX FUERA PERFECTA.... ESTARÍA ESCRITA EN C++

eferion

Cita de: 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.

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.

rir3760

Cita de: MessageBoxA en 10 Junio 2014, 04:06 AMhice 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 */

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:
scanf("%d",&k);

/* ... */

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
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