elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Lectura y escritura en Archivos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Lectura y escritura en Archivos  (Leído 2,698 veces)
Swastik

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Lectura y escritura en Archivos
« en: 7 Febrero 2015, 23:36 pm »

Buenas a todos,

habra alguna alma caritativa que me resuelva la siguiente duda?

Lo que quiero hacer es grabar un árbol binario en un archivo, el árbol lo tengo listo, pero la parte de guardarlo en un archivo no tengo ni idea por donde comenzar.

asi va mi arbol


Código
  1. typedef struct nodoarbol
  2. {                                                    //ESTRUCTURA DEL ARBOL
  3.      char      placa[10];
  4.      int          cedula;
  5.      char     nombre[20];
  6.      char      marca[15];
  7.      char     modelo[15];
  8.      int            anio;
  9.      char      color[10];
  10.    char serial_motor[20];
  11.      char      email[25];
  12.    struct nodoarbol *izq;
  13.    struct nodoarbol *der;
  14.  
  15.    }NODO;
  16.  
  17.  

asi va el main


Código
  1. int main()
  2. {
  3.  
  4.    NODO *raiz=NULL;
  5.    FILE *fichero;
  6.  
  7.    if ((fichero=fopen(ARCHIVO,"rb+"))==NULL)
  8.    if ((fichero=fopen(ARCHIVO,"wb+"))==NULL)
  9.        {
  10.            printf("No se pudo abrir el archivo");
  11.        }
  12.  
  13.  
  14.  
  15.    int ci=0,anio;
  16.    char placa[10],placa2[10],placa3[10];
  17.    char nombre[20],marca[15],modelo[15];
  18.    char color[10],ser_motor[20],email[25];
  19.  
  20.  
  21.   int numero,opc,elim;
  22.  
  23.      while(opc!=6)
  24.   {
  25.       printf("\n\t\t\tMENU PRINCIPAL\n\n\n");
  26.       printf("\t 1. INTRODUCIR VALORES\n");
  27.       printf("\t 2. LISTAR\n");
  28.       printf("\t 3. VER ARBOL\n");
  29.       printf("\t 4. BUSCAR PLACA\n");
  30.       printf("\t 5. ELIMINAR PLACA\n");
  31.  
  32.       scanf("%d", &opc);  
  33.  
  34.         switch(opc)
  35.         {
  36.            case 1:
  37.  
  38.                    printf("Ingrese la PLACA:");
  39.                    scanf("%s",placa);
  40.                    printf("\nIngrese la CEDULA del Propietario:");
  41.                    scanf("%d",&ci);
  42.                    printf("\nIngrese el NOMBRE del Propietario:");
  43.                    scanf("%s",nombre);
  44.                    printf("\nIngrese la MARCA del auto:");
  45.                    scanf("%s",marca);
  46.                    printf("Ingrese la MODELO del auto:");
  47.                    scanf("%s",modelo);
  48.                    printf("Ingrese el anio del auto:");
  49.                    scanf("%d",&anio);
  50.                    printf("Ingrese el COLOR del auto:");
  51.                    scanf("%s",color);
  52.                    printf("Ingrese el SERIAL DEL MOTOR del auto:");
  53.                    scanf("%s",ser_motor);
  54.                    printf("Ingrese el EMAIL del propietario:");
  55.                    scanf("%s",email);
  56.                    insertanodonuevo(raiz,placa,ci,nombre,marca,modelo,anio,color,ser_motor,email);  ///inserto datos al arbol.
  57.  
  58.                    getch();
  59.                    break;
  60.  
  61.            case 2: printf("\n INORDEN:");
  62.                    inorden(raiz);
  63.                    break;
  64.  
  65.            case 3: verArbol(raiz);        
  66.                    break;
  67.  
  68.            case 4: printf("Ingrese la PLACA a BUSCAR:");
  69.                    //gets(placa);
  70.                    scanf("%s",placa2);  
  71.                    printf("ENCONTRADO? [%d]",buscar_nodo(raiz,placa2));
  72.                    break;
  73.            case 5:  printf("Ingrese la PLACA a ELIMINAR:");
  74.                    //gets(placa);
  75.                    scanf("%s",placa3);
  76.                    eliminarElemArbol(raiz,placa3);
  77.                    break;    
  78.         }
  79.    }
  80.  
  81.  
  82.    fclose(fichero);                            
  83. getch();    
  84. }
  85.  



mi pregunta es como hago para guardar los datos en el archivo? se que tengo que abrir el archivo con fopen en modo añadir y luego utilizar la función fwrite(&r,sizeof(NODO),1,f); , pero lo que no entiendo es en donde aplicarlo?

por ejemplo si lo hago de esta manera, seria lo correcto?


Código
  1. void insertanodonuevo(NODO *&rarbol,char nuevo[],int ced,char nomb[],char marc[],char mod[],int anio,char color[],char ser_motor[],char email[])
  2. {    NODO r;
  3.     FILE *f;
  4.     if ((f = fopen(ARCHIVO, "a")) != NULL)
  5.  
  6.     if(rarbol==NULL)
  7.     {                          
  8.        rarbol=(NODO*)malloc(sizeof(NODO));
  9.  
  10.           if(rarbol!=NULL)
  11.           {
  12.              strcpy(rarbol->placa,nuevo);
  13.              strcpy(rarbol->nombre,nomb);
  14.              strcpy(rarbol->marca,marc);
  15.              strcpy(rarbol->modelo,mod);
  16.              strcpy(rarbol->color,color);
  17.              strcpy(rarbol->serial_motor,ser_motor);
  18.              strcpy(rarbol->email,email);  
  19.              rarbol->cedula=ced;
  20.              rarbol->anio=anio;
  21.              rarbol->izq=NULL;
  22.              rarbol->der=NULL;
  23.           }
  24.           else
  25.           {
  26.                printf("\n**** Memoria No Disponible !!!!\n");
  27.           }
  28.     }
  29.     else
  30.         if(st(nuevo,rarbol->placa))
  31.         insertanodonuevo(rarbol->izq,nuevo,ced,nomb,marc,mod,anio,color,ser_motor,email);  
  32.         else
  33.         if(st(nuevo,rarbol->placa)  
  34.         insertanodonuevo(rarbol->der,nuevo,ced,nomb,marc,mod,anio,color,ser_motor,email);
  35.         else
  36.         printf("EL ELEMENTO YA EXISTE");  
  37.  
  38.         fwrite(&r,sizeof(NODO),1,f);
  39.  
  40.    fclose(f);
  41.  
  42. }




o lo tengo que hacer en el main?


de igual manera para leer el archivo... así lo hago pero evidentemente no funciona


///funcion para mostrar los datos del arbol en orden.

Código
  1. void inorden(NODO *rarbol)
  2. {
  3.     NODO r;
  4.     FILE *f;
  5.     if ((f = fopen(ARCHIVO, "rb")) != NULL)
  6.  
  7. fread(&r,sizeof(r),1,f);
  8.  while(!feof(f))  
  9.  {
  10.  
  11.     if(rarbol)
  12.     {
  13.      inorden(rarbol->izq);
  14.      printf("\n_________________________");
  15.      printf("\nPLACA: %s",rarbol->placa);
  16.      printf("\nNOMBRE PROPIETARIO: %s",rarbol->nombre);
  17.      printf("\nC.I PROPIETARIO: %d",rarbol->cedula);
  18.      printf("\nMARCA DEL AUTO: %s",rarbol->marca);
  19.      printf("\nMODELO DEL AUTO: %s",rarbol->modelo);
  20.      printf("\nANIO DEL AUTO: %d",rarbol->anio);
  21.      printf("\nCOLOR DEL AUTO: %s",rarbol->color);
  22.      printf("\nSERIAL MOTOR DEL AUTO: %s",rarbol->serial_motor);
  23.      printf("\nEMAIL DEL PROPIETARIO: %s",rarbol->email);
  24.      printf("\n_________________________");
  25.      fread(&r,sizeof(NODO),1,f);
  26.      inorden(rarbol->der);
  27.     }
  28.  
  29.  }
  30.     fclose(f);
  31.  
  32. }
  33.  


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Lectura y escritura en Archivos
« Respuesta #1 en: 8 Febrero 2015, 00:27 am »

El tema sería pasarle el árbol a una función que lo serialize.

El caso está, en que tienes que crear tú mismo un formato binario para ponerlo.

Por ejemplo, podrías guardar algo así como:
Código:
placa : 10 bytes
cedula : 4 bytes
etc ...
nodo izquierda? : 1byte (0 o 1)
<nodo izquierda> (si hay)
nodo derecha? : 1byte (0 o 1)
<nodo derecha> (si hay)


En línea

Swastik

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Lectura y escritura en Archivos
« Respuesta #2 en: 8 Febrero 2015, 00:45 am »

El tema sería pasarle el árbol a una función que lo serialize.

El caso está, en que tienes que crear tú mismo un formato binario para ponerlo.

Por ejemplo, podrías guardar algo así como:
Código:
placa : 10 bytes
cedula : 4 bytes
etc ...
nodo izquierda? : 1byte (0 o 1)
<nodo izquierda> (si hay)
nodo derecha? : 1byte (0 o 1)
<nodo derecha> (si hay)

Perdon, pero no te entendi, te refieres al ordenamiento del arbol? si es asi lo ordeno por la placa del auto( es un arbol que guarda datos de transito)
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Lectura y escritura en Archivos
« Respuesta #3 en: 8 Febrero 2015, 01:00 am »

Para guardar un objeto en un archivo, necesitas serializarlo, es decir, pasarlo a una cadena de caracteres. Yo ahí he propuesto una forma de convertir tu árbol, en una cadena.

He puesto primero el nombre de la variable, y a su lado su tamaño en bytes.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Lectura y Escritura de CDs y DVDs.
Hardware
B€T€B€ 8 7,977 Último mensaje 19 Julio 2011, 01:18 am
por B€T€B€
[Ayuda] Lectura y escritura de archivos.
Java
ignorantev1.1 3 2,867 Último mensaje 30 Marzo 2013, 18:03 pm
por ignorantev1.1
lectura y escritura de ficheros
Programación C/C++
franfis 6 3,900 Último mensaje 20 Abril 2013, 19:16 pm
por cypascal
Escritura y lectura de archivos binarios
Programación C/C++
++c 7 3,930 Último mensaje 10 Septiembre 2014, 23:21 pm
por ++c
[AYUDA] Lectura y escritura de archivos
Programación C/C++
Kougami 3 2,444 Último mensaje 27 Noviembre 2016, 20:38 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines