ayuda para guardar un archivo de texto...

benji
16 de Mayo del 2004
Bueno mi problema esque este codigo me guarda solo el ultimo contacto que tengo en la agenda.

He definido una estructura y Cap es un puntero a ella.
*pCap es un puntero a Cap. (Ambos globales)
nose como conseguir que me guarde toda la lista porque si tengo mas de un contacto solo me guarda el ultimo. gracias AYUDA !!


void guardar(){

FILE *archivo;
int tam;
struct _agenda *aux;
char nom[9];
tam=sizeof(struct _agenda);
aux=*pCap;

if (aux==NULL){
system("cls");
printf ("Agenda vacia, sin datos que guardar.nn");
printf ("Presiona cualquier tecla para volver al menu");
getch();
}
else{
system("cls");
printf ("Introduce un nombre para el archivo : ");
gets(nom);
strcat(nom,".txt");

archivo = fopen(nom,"wt");

while (aux!=*pCap){
fwrite(aux,tam,1,archivo);
aux=aux->sig;
}
}
if (fclose(archivo)!=0){
printf( "Problemas al guardar el fichero" );
}
else {
system ("cls");
printf ("Guardadonn");
printf ("Presiona cualquier tecla para continuar");
fclose(archivo);
}
getch();

}

a_l_p
16 de Mayo del 2004
Deberías empezar por comprobar que la sentencia

archivo = fopen(nom,"wt");

no te devuelve NULL

benji
16 de Mayo del 2004
Tienes razón, aunque ya lo sabia porque el archivo me lo creaba y tal, pero como ya digo me sigue pasando lo mismo. Gracias de todas formas. Sigo pensando que el error está en el while. [ En el archivo de texto que crea solo veo las datos del ultimo contacto por tanto la funcion cargar doy por supuesto que esta bien... ]

printf ("Introduce un nombre para el archivo : ");
gets(nom);
strcat(nom,".txt");

archivo = fopen(nom,"wb");

if (archivo==NULL){
printf ("ERROR");
}

while (aux!=NULL){
fwrite(aux,tam,1,archivo);
aux=aux->sig;
}

//He modificado el while porque antes lo tenia peor... me ekivoke y copie una d las modifcaciones pero creo que tiene que estar por aqui. Agradeceria ayuda.
Saludos

a_l_p
16 de Mayo del 2004
Supongo que es una lista enlazada por la sentencia ' aux=aux->sig;'. Has comprobado que los punteros de la lista sean corectos?
Prueba a imprimir los datos en lugar de guardarlos y te aseguras de que la lista esté bien construida.

while (aux!=NULL){
printf(.......);
aux=aux->sig;
}

Un saludo.

benji
16 de Mayo del 2004
Vale, he comprobado lo que me dijiste y efectivamente hace bien los printf, con lo cual llego a la conclusion que lo que tengo mal es el CARGAR. Ya que solo cargaria el ultimo elemento ?? y luego al darle a ver pues solo sale ese.

Alguna idea ?

//Cargamos el archivo
void cargar(){

char nom[9];

FILE *archivo;
struct _agenda *aux;

system("cls");
printf ("Introduce el nombre del archivo a cargar : ");
gets(nom);
strcat(nom,".txt");

archivo=fopen(nom,"rb");

if (archivo==NULL){
system("cls");
printf("Error. No se pudo cargar el archivo.");
getch();
}
else {
aux=(struct _agenda*)malloc (sizeof(struct _agenda));

while (!feof(archivo)){
fread(aux,sizeof(struct _agenda),1,archivo);
}

aux->sig=*pCap;
*pCap=aux;

fclose(archivo);
}

}

ese es el codigo de la funcion cargar...
Merci y un saludo.

a_l_p
16 de Mayo del 2004
.................
aux=(struct _agenda*)malloc (sizeof(struct _agenda));

while (!feof(archivo)){
fread(aux,sizeof(struct _agenda),1,archivo);
/* LEES SIN HACER NADA */
}

aux->sig=*pCap;
*pCap=aux;
......................

luego haces que el siguiente sea pCap, y luego asignas este a aux.

int primero = 1;
struct agenda *ptr_anterior;

while (!feof(archivo)){
aux=(struct _agenda*)malloc (sizeof(struct _agenda));
memset(aux, 0, sizeof(struct agenda));
fread(aux,sizeof(struct _agenda),1,archivo);

ptr_anterior = aux;

if (primero) {
/* suponemos que pCap es un puntero al inicio de la lista */
pCap = aux;
primero = 0;
} else {
/* asignamos el puntero 'sig' del anterior al actual */
ptr_anterior->sig = aux;
}
}

Cuando reservas memoria, malloc no la limpia. Así, el campo 'sig' podría contener basura. Por eso debes borrarla con memset, o cualquier otra función, o simplemente asignar aux->sig = NULL; así aseguras que el último elemento tiene el puntero 'sig' a NULL.

Por supuesto, faltaría la comprobación de malloc(), fread()...

Un saludo.