Programación General > C/C++
archivos
(1/1)
faio:
me falta la parte de archivos que no funciona, hace tiempo que no programo en c y olvide algunas cosas
--- Código: C --- typedef struct nodoagenda{ int dni; char nombre[15]; char apellidos[25]; char direccion[30]; struct nodoagenda *ant; struct nodoagenda *sig; }nodoagenda; void CrearAgenda(nodoagenda *(&)); int AgendaVacia(nodoagenda *); int AgendaLlena(nodoagenda *); int EstaElementoAgenda(nodoagenda *,int); void InsertarAgenda(nodoagenda *(&)); void EliminarElementoAgenda(nodoagenda *(&)); void MostrarInversoAgenda(nodoagenda *); void BorrarAgenda(nodoagenda *(&)); void GuardarAgenda(nodoagenda *); void LeerAgenda(nodoagenda *listad); //void CrearAgenda(nodoagenda *(&listad)){ listad = NULL;}/*****************************************************************************************/int AgendaVacia(nodoagenda *listad){ int dev = 0; if (listad==NULL) dev = -1; return dev;}/*****************************************************************************************/// Controlaremos la memoria en la insercion de elementos en la listaint AgendaLlena(nodoagenda *){ return 0;}/*****************************************************************************************/// Devuelve -1 si el elemento esta en la lista. 0 en caso contrarioint EstaElementoAgenda(nodoagenda *listad,int dni){ nodoagenda *Paux; int res; Paux = listad; while ((Paux != NULL)&&(Paux->dni != dni)) Paux = Paux->sig; if (Paux == NULL) res = 0; else res = -1; return res;}/*****************************************************************************************/void InsertarAgenda(nodoagenda *(&listad)){ nodoagenda *Nuevonodo, *Paux; int dni; char nombre[15],apellidos[25]; Nuevonodo = (nodoagenda *)malloc(sizeof(nodoagenda)); if (Nuevonodo == NULL) printf("nSe produjo un error en la creación del elemento."); else { do{ printf("Introduce el dni: "); scanf("%d",&dni); }while((dni < 1)||(EstaElementoAgenda(listad,dni))); Nuevonodo->dni = dni; fflush(stdin); //Borra el buffer de teclado printf("Introduce el nombre: "); gets(Nuevonodo->nombre); printf("Introduce los apellidos: "); gets(Nuevonodo->apellidos); printf("Introduce la direccion: "); gets(Nuevonodo->direccion); Nuevonodo->sig = NULL; Nuevonodo->ant = NULL; if (AgendaVacia(listad)) listad = Nuevonodo; else { if (dni > listad->dni) { Nuevonodo->sig = listad; listad->ant=Nuevonodo; listad = Nuevonodo; } else { Paux = listad; while (((Paux->sig)!=NULL)&&((dni < Paux->sig->dni))) Paux = Paux->sig; if (Paux->sig != NULL) //Si no es el ultimo nodo Paux->sig->ant=Nuevonodo; Nuevonodo->sig = Paux->sig; Nuevonodo->ant = Paux; Paux->sig = Nuevonodo; } } } } /*****************************************************************************************/void EliminarElementoAgenda(nodoagenda *(&listad),int dni){ nodoagenda *actual = listad; while (actual->dni != dni) actual = actual->sig; if (actual->ant == NULL) // Es el primer nodo de la lista { if (actual->sig!=NULL) // Hay mas de un nodo en la lista actual->sig->ant=NULL; listad=actual->sig; } else { if (actual->sig!=NULL) // Es el ultimo nodo de la lista actual->sig->ant=actual->ant; actual->ant->sig=actual->sig; } free(actual);} /*****************************************************************************************/void MostrarInversoAgenda(nodoagenda *listad){ nodoagenda *paux=listad; if (paux != NULL) { // Recorremos toda la lista hasta el final while (paux->sig != NULL) paux=paux->sig; // Recorremos toda la lista en orden inverso hasta el primer nodo while (paux != NULL) { printf("nnDNI: %d",paux->dni); printf("nNombre: %s",paux->nombre); printf("nApellidos: %s",paux->apellidos); printf("nDireccion: %s",paux->direccion); paux=paux->ant; } }}/*****************************************************************************************/void BorrarAgenda(nodoagenda *(&listad)){ nodoagenda *paux; while (listad != NULL) { paux=listad; listad=listad->sig; free(paux); }}/*****************************************************************************************/void GuardarAgenda(nodoagenda *listad){ nodoagenda *paux=listad; FILE*pFile; if (paux != NULL) { // Recorremos toda la lista hasta el final while (paux->sig != NULL) paux=paux->sig; pFile = fopen ( "amigos.txt" , "wb" );//abrir fichero if(pFile== NULL) puts ("nError guardando el fichero."); else { // Recorremos toda la lista en orden inverso hasta el primer nodo while (paux != NULL) { fwrite(&paux, sizeof paux, 1, pFile); printf("nnDNI: %d",paux->dni); printf("nNombre: %s",paux->nombre); printf("nApellidos: %s",paux->apellidos); printf("nDireccion: %s",paux->direccion); paux=paux->ant; } if( !fclose(pFile) ) printf( "Fichero Guardadon" ); else printf( "Error: Fichero NO Guardadon" ); } }}/*****************************************************************************************/void LeerAgenda(nodoagenda *listad){ nodoagenda *Nuevonodo; FILE *file = fopen("amigo.txt", "rb"); if ( file != NULL ) { fclose(file); } }
Gracias de antemano.
czealt:
Debes reemplazar la linea:
fwrite(&paux, sizeof paux, 1, pFile);
por la siguiente:
fwrite(paux, sizeof(nodoagenda), 1, pFile);
Saludos :good:
faio:
Muchas gracias
y la condición para leer la sabrías
czealt:
Bueno, para leer datos de un archivo binario se usa la funcion fread() que acepta los mismos 4 parametros que la funcion fwrite() solo que en lugar de escribir del buffer al disco se lee del disco al buffer.
Ejemplo:
--- Código: C --- void LeerAgenda(){ nodoagenda nodo; FILE *file = fopen("amigos.txt", "rb"); while(fread(&nodo,sizeof(nodoagenda),1,file)) /* fread() devuelve la cantidad de registros leidos, cuando se llega al final del archivo este valor es 0 y el bucle termina. */ { printf("DNI: %dn",nodo.dni); printf("Nombre: %sn",nodo.nombre); printf("Apellidos: %sn",nodo.apellidos); printf("Direccion: %sn",nodo.direccion); } fclose(file);}
faio:
Gestoragenda.c
--- Código: C --- #include <stdio.h>#include <stdlib.h>#include <iostream.h>#include <conio.h>#include "agenda.h" char Menu(void); int main(void){ nodoagenda *lista; int num; char op; CrearAgenda(lista); do{ op = Menu(); switch(op) { //*********************************** case 'A': { if (!AgendaLlena(lista)) InsertarAgenda(lista); else printf("nNo se puede insertar debido a que la lista esta llena."); break; } //*********************************** case 'B': { do{ printf("Introduce el dni de la persona a eliminar: "); scanf("%d",&num); }while (num<1); if (EstaElementoAgenda(lista,num)) EliminarElementoAgenda(lista,num); else printf("nEsa persona no se encuentra en la lista."); break; } //*********************************** case 'C': { printf("n"); MostrarInversoAgenda(lista); getch(); break; } //*********************************** case 'D'://guardar en fichero { printf("n"); GuardarAgenda(lista); getch(); break; } //*********************************** case 'E'://leer de fichero { printf("n"); LeerAgenda(); getch(); break; } //*********************************** case 'F'://borrar y salir { BorrarAgenda(lista); break; } } }while (op!='F'); printf("nn"); system("pause");} char Menu(void){ char opcion; do{ fflush(stdin); system("cls"); printf("n***************************************************************** "); printf("n A - Insertar en Agenda"); printf("n B - Eliminar de Agenda"); printf("n C - Mostrar Agenda Orden Creciente"); printf("n D - Guardar Agenda"); printf("n E - Leer de Fichero"); printf("n F - Borrar agenda y Salir"); printf("n***************************************************************** "); printf("nIntroduce una opcion: "); scanf("%c",&opcion); system("cls"); opcion = toupper(opcion); //tolower }while ((opcion<'A')||(opcion>'F')); return opcion;}
agenda.h
--- Código: C --- typedef struct nodoagenda{ int dni; char nombre[15]; char apellidos[25]; char direccion[30]; struct nodoagenda *ant; struct nodoagenda *sig; }nodoagenda; void CrearAgenda(nodoagenda *(&)); int AgendaVacia(nodoagenda *); int AgendaLlena(nodoagenda *); int EstaElementoAgenda(nodoagenda *,int); void InsertarAgenda(nodoagenda *(&)); void EliminarElementoAgenda(nodoagenda *(&)); void MostrarInversoAgenda(nodoagenda *); void BorrarAgenda(nodoagenda *(&)); void GuardarAgenda(nodoagenda *); void LeerAgenda(); //void CrearAgenda(nodoagenda *(&listad)){ listad = NULL;}/*****************************************************************************************/int AgendaVacia(nodoagenda *listad){ int dev = 0; if (listad==NULL) dev = -1; return dev;}/*****************************************************************************************/// Controlaremos la memoria en la insercion de elementos en la listaint AgendaLlena(nodoagenda *){ return 0;}/*****************************************************************************************/// Devuelve -1 si el elemento esta en la lista. 0 en caso contrarioint EstaElementoAgenda(nodoagenda *listad,int dni){ nodoagenda *Paux; int res; Paux = listad; while ((Paux != NULL)&&(Paux->dni != dni)) Paux = Paux->sig; if (Paux == NULL) res = 0; else res = -1; return res;}/*****************************************************************************************/void InsertarAgenda(nodoagenda *(&listad)){ nodoagenda *Nuevonodo, *Paux; int dni; char nombre[15],apellidos[25]; Nuevonodo = (nodoagenda *)malloc(sizeof(nodoagenda)); if (Nuevonodo == NULL) printf("nSe produjo un error en la creación del elemento."); else { do{ printf("Introduce el dni sin letra: "); scanf("%d",&dni); }while((dni < 1)||(EstaElementoAgenda(listad,dni))); Nuevonodo->dni = dni; fflush(stdin); //Borra el buffer de teclado printf("Introduce el nombre: "); gets(Nuevonodo->nombre); printf("Introduce los apellidos: "); gets(Nuevonodo->apellidos); printf("Introduce la direccion: "); gets(Nuevonodo->direccion); Nuevonodo->sig = NULL; Nuevonodo->ant = NULL; if (AgendaVacia(listad)) listad = Nuevonodo; else { if (dni > listad->dni) { Nuevonodo->sig = listad; listad->ant=Nuevonodo; listad = Nuevonodo; } else { Paux = listad; while (((Paux->sig)!=NULL)&&((dni < Paux->sig->dni))) Paux = Paux->sig; if (Paux->sig != NULL) //Si no es el ultimo nodo Paux->sig->ant=Nuevonodo; Nuevonodo->sig = Paux->sig; Nuevonodo->ant = Paux; Paux->sig = Nuevonodo; } } } } /*****************************************************************************************/void EliminarElementoAgenda(nodoagenda *(&listad),int dni){ nodoagenda *actual = listad; while (actual->dni != dni) actual = actual->sig; if (actual->ant == NULL) // Es el primer nodo de la lista { if (actual->sig!=NULL) // Hay mas de un nodo en la lista actual->sig->ant=NULL; listad=actual->sig; } else { if (actual->sig!=NULL) // Es el ultimo nodo de la lista actual->sig->ant=actual->ant; actual->ant->sig=actual->sig; } free(actual);} /*****************************************************************************************/void MostrarInversoAgenda(nodoagenda *listad){ nodoagenda *paux=listad; if (paux != NULL) { // Recorremos toda la lista hasta el final while (paux->sig != NULL) paux=paux->sig; // Recorremos toda la lista en orden inverso hasta el primer nodo while (paux != NULL) { printf("nnDNI: %d",paux->dni); printf("nNombre: %s",paux->nombre); printf("nApellidos: %s",paux->apellidos); printf("nDireccion: %s",paux->direccion); paux=paux->ant; } }}/*****************************************************************************************/void BorrarAgenda(nodoagenda *(&listad)){ nodoagenda *paux; while (listad != NULL) { paux=listad; listad=listad->sig; free(paux); }}/*****************************************************************************************/void GuardarAgenda(nodoagenda *listad){ nodoagenda *paux=listad; FILE*pFile; int i=0; if (paux != NULL) { // Recorremos toda la lista hasta el final while (paux->sig != NULL) paux=paux->sig; pFile = fopen ( "amigos.dat" , "wb" );//abrir fichero if(pFile== NULL) puts ("nError guardando el fichero."); else { // Recorremos toda la lista en orden inverso hasta el primer nodo while (paux != NULL) { fwrite(paux, sizeof(nodoagenda), 1, pFile); paux=paux->ant; } if( !fclose(pFile) ) printf( "Fichero Guardadon" ); else printf( "Error: Fichero NO Guardadon" ); } }}/*****************************************************************************************/void LeerAgenda(){ nodoagenda nodo; FILE*pFile = fopen("amigos.dat", "rb"); while(fread(&nodo,sizeof(nodoagenda),1,pFile)) /* fread() devuelve la cantidad de registros leidos, cuando se llega al final del archivo este valor es 0 y el bucle termina. */ { printf("DNI: %dn",nodo.dni); printf("Nombre: %sn",nodo.nombre); printf("Apellidos: %sn",nodo.apellidos); printf("Direccion: %sn",nodo.direccion); } fclose(pFile); }
Muchisimas gracias, Ahora va perfecto.
Navegación
Ir a la versión completa