Discussion:
Volcado datos de un fichero de texto a un array de estructuras anidadas
(demasiado antiguo para responder)
d***@mailinator.com
2005-05-28 17:06:25 UTC
Permalink
/* El programa recibe como argumentos los nombres del fichero de
entrada y el del
fichero de salida. El fichero de entrada es un fichero de texto en el
que aparecen los
datos del asegurado seguido de los datos de sus hijos con el siguiente
formato:

DNI nombre dirección edad num_hijos
DNI nombre edad
DNI nombre edad
DNI nombre dirección edad num_hijos
DNI nombre dirección edad num_hijos
DNI nombre edad

Lo que pretendo conseguir es pasar los datos del fichero de texto a una
nueva estructura de datos (array de estructuras de tipo padre, con sus
correspondientes punteros a listas de hijos si se da el caso). El paso
a fichero aún no está implementado, de momento solo me interesa el
paso al array con los hijos correspondientes a cada asegurado[i].
Con un hijo me funciona todo OK, pero a la hora de meter varios,
supongo que tendré que hacer que el campo hijos de la estructura padre
sea un puntero

struct padre
{
char dni[10];
char nombre[20];
char direccion[30];
int edad;
int num_hijos;
struct hijo *hijos;
};
y luego si al leer la línea del padre este tiene hijos reservar
memoria para la lista de hijos (array de estructuras hijo), supongo que
con algo asi como --> hijos=(struct hijo *) calloc (nh, sizeof(struct
hijo)); y luego con un for hacer el fscanf para cada hijo.

El caso es que no sé si a la variable que reserva memoria para el
array de hijos, puede llamarse de cualquier manera, o debe llamarse
igual que la variable definida en la estructura padre. Y si el tipo de
esta variable serña un puntero.

Agradecería alguien me ayude un poco con esto. Gracias
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct hijo
{
char dni[10];
char nombre[20];
int edad;
};

struct padre
{
char dni[10];
char nombre[20];
char direccion[30];
int edad;
int num_hijos;
struct hijo hijos;
};

// Cuenta los asegurados que sean padres, los hijos no los contabiliza
int longitud (FILE *fichero)
{
int i, longitud, edad, num_hijos;
char cadena[75], dni[10], nombre[20], direccion[30];
longitud=0;

while (!feof(fichero))
{
fscanf (fichero, "%s %s %s %i %i", dni, nombre, direccion,
&edad, &num_hijos);
if (num_hijos>0)
for (i=0; i<=num_hijos; i++)
fscanf (fichero, "%s %s %i", dni, nombre, &edad);
longitud++;
}
return longitud;
}

// Pasa los datos del fichero origen a un array de estructuras donde
cada padre puede tener varios hijos
void volcar (FILE *fichero, struct padre *asegurados, int longitud)
{
int i, nh, j;
struct hijo *hijos;
i=0;

fseek(fichero, 0, SEEK_SET);
while (i<longitud)
{
fscanf (fichero, "%s %s %s %i %i", asegurados[i].dni,
asegurados[i].nombre, asegurados[i].direccion, &asegurados[i].edad,
&asegurados[i].num_hijos);
nh=asegurados[i].num_hijos;
if (nh>0)
{
// hijos=(struct hijo *) calloc (nh, sizeof(struct hijo));
fscanf (fichero, "%s %s", asegurados[i].hijos.dni,
asegurados[i].hijos.nombre);
}
i++;
}
}


// Muestra los datos almacenados en el array de estructuras
void mostrar (struct padre *asegurados, int longitud)
{
int i, j, nh;
i=0;

while (i<longitud)
{
printf ("\nDNI: %s \n", asegurados[i].dni);
printf ("Nombre: %s \n", asegurados[i].nombre);
printf ("Direccion: %s \n", asegurados[i].direccion);
printf ("Edad: %i \n", asegurados[i].edad);
printf ("Numero de hijos: %i \n", asegurados[i].num_hijos);

nh=asegurados[i].num_hijos;
if (nh>0)
{
printf ("\n DNI: %s", asegurados[i].hijos.dni);
printf ("\n Nombre: %s \n",
asegurados[i].hijos.nombre);
// printf ("\n Edad: %i", asegurados[i].hijos.edad);
}
i++;
}
}

int main (int argc, char **argv)
{
int long_entrada, long_salida, contador;
struct padre *lasegurados, *lasegurados2;
FILE *fentrada, *fsalida;
contador=0;

if ((fentrada=fopen(argv[1],"r"))==NULL)
{
printf ("ERROR: El fichero de entrada no existe, o no puede ser
abierto \n");
exit(1);
}
else
{
long_entrada=longitud (fentrada);
lasegurados=(struct padre *) calloc (long_entrada, sizeof(struct
padre));
printf ("Hay %i asegurados\n", long_entrada);
volcar (fentrada, lasegurados, long_entrada);
mostrar (lasegurados, long_entrada);
printf ("\n");
}

free (lasegurados);
return (1);
}
pitukilloloco
2005-05-30 18:23:10 UTC
Permalink
Antes de revisar el código de tu programa ¿me podrías decir qué es lo que quieres? porque al principio sólo pones que recibes como argumentos los nombres de los dos archivos. Además no acabo de entender el formato que dices que tiene el asegurado. Según entiendo va a ver una línea de texto con los datos nombre, dirección, edad y número de hijos ¿y después de esta línea qué? ¿se supone que va a ver igual número de líneas como esté en el dato número de hijos? ¿los campos cómo están separado? ¿qué signica DNI? ¿va a venir estas siglas en el archivo

--
pitukilloloco

-----------------------------------------------------------------------
Ver este tema: http://www.softwaremix.net/viewtopic-394705.html

Enviado desde http://www.softwaremix.net

Loading...