Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Lectura y escritura en Archivo

Estas en el tema de Lectura y escritura en Archivo en el foro de C/C++ en Foros del Web. 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, ...
  #1 (permalink)  
Antiguo 07/02/2015, 15:22
Avatar de Swastik  
Fecha de Ingreso: noviembre-2013
Mensajes: 9
Antigüedad: 10 años, 5 meses
Puntos: 1
Lectura y escritura en Archivo

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 C:
Ver original
  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;


asi va el main

Código C:
Ver original
  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. }



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 C:
Ver original
  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(strcmp(nuevo,rarbol->placa)<0)
  31.          insertanodonuevo(rarbol->izq,nuevo,ced,nomb,marc,mod,anio,color,ser_motor,email);  
  32.          else
  33.          if(strcmp(nuevo,rarbol->placa)>0)  
  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 C:
Ver original
  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. }
  #2 (permalink)  
Antiguo 07/02/2015, 19:11
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Lectura y escritura en Archivo

Lo puedes hacer como en el articulo (solo que en lugar de números tienes tu estructura).
http://leetcode.com/2010/09/serializ...of-binary.html

Es bastante simple:
Para grabar
1. Recorres el arbol pre-order
2. Si un nodo esta vacio, pones algún dato que te lo indique.
3. Si no pones el valor del nodo.


Para leer
1. Lees archivo estructura por estructura
2. Y usas otra vez pre-order para ir construyendo el arbol

Etiquetas: char, escritura, funcion, int, lectura, lista, numero
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:01.