ayuda para guardar un archivo de texto...
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();
}
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();
}
Deberías empezar por comprobar que la sentencia
archivo = fopen(nom,"wt");
no te devuelve NULL
archivo = fopen(nom,"wt");
no te devuelve NULL
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
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
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.
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.
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.
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.
.................
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.
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.
