Advertisement
Juan_Blanc

[C] Archivos de Acceso Aleatorio

Mar 17th, 2015
348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.99 KB | None | 0 0
  1. /*Se tiene un archivo de acceso aleatorio conteniendo los datos de un grupo de personas, el mismo
  2. almacena la información según el siguiente formato:
  3. typedef struct{
  4. char nya[30];
  5. int edad;
  6. float alt;
  7. } tficha;
  8. Implemente una aplicación que permita generar un archivo de texto conteniendo todos los datos de
  9. aquellas personas mayores de 18 años.
  10. Nota: El archivo de texto deberá contener, por renglón, los datos de las personas separados por “;”.
  11. Luego implemente una aplicación que, a partir de un archivo de texto como el creado en el punto 3,
  12. genere un archivo de acceso aleatorio cuyos datos se encuentren ordenados alfabéticamente. El
  13. archivo de texto es un argumento de la línea de órdenes.
  14. */
  15.  
  16.  
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #define CR 8
  20.  
  21. typedef struct{
  22.          char nya[30];
  23.          int edad;
  24.          float alt;
  25.                } Tficha;
  26.  
  27. int compnyaficha (Tficha f1, Tficha f2);
  28. void ordenavector(int tamanio , Tficha *vect, int (*funcomp)(Tficha,Tficha));
  29. void ordenaArch(FILE *arch ,  int (*funcomp)( Tficha , Tficha));
  30.  
  31. int main(int argc, char *argv[])
  32. {
  33.   FILE *archivobin;
  34.   FILE *archivobinord;
  35.   FILE *archtxt;
  36.   char nyap[30];
  37.   int i,eda;
  38.   float altu;
  39.   Tficha reg1, regaux;
  40.  char nomarch[250];
  41.  char linea[100];
  42.  char *aux;
  43.  long cantreg;
  44.  
  45.  
  46.  if (argc > 0)
  47.  {printf ("Argumentos recibidos %d \n", argc);
  48.     for (i=0 ;i<argc ; i++)
  49.     {
  50.     printf ("ARG %d :  %s \n",i, argv[i]);
  51.     }          
  52.          
  53. }
  54.  if (argc>1)
  55.  strcpy(nomarch,argv[1]);
  56.  else
  57.  strcpy(nomarch,"Mayores.txt");
  58.  
  59.   // Lectura
  60.    archtxt = fopen (nomarch, "rt");
  61.    if (!archtxt)
  62.    {printf ("ERROR No se pudo abrir el archivo : %s\n\n",nomarch);
  63.    exit -1;    
  64.    }
  65.    archivobin = fopen ("NOrdenado.dat", "wb+");
  66.    if (!archivobin)
  67.    {printf ("No se pudo abrir el archivo NOrdenado.dat \n");  
  68.    exit -1;}
  69.    else
  70.    {
  71.        printf("\nLectura del archivo  : %s\n", nomarch);
  72.        printf ("             Nombre               Edad    Altura \n");
  73.    
  74.        while ( ! feof(archtxt))
  75.              {  if ( fscanf (archtxt,"%100s",linea ) > 0)
  76.                 {    if (strlen(linea)>4)
  77.                      {
  78.                     aux = strtok(linea,";");
  79.                      strcpy(reg1.nya,aux);
  80.                      aux=  strtok(NULL,";");
  81.                      reg1.edad = atoi(aux);
  82.                      aux=  strtok(NULL,";");
  83.                      reg1.alt = atof(aux);
  84.                      // sscanf (aux,"%f",&reg1.alt);                    
  85.                      printf( " Datos : %30s %6d %8.2f \n" , reg1.nya , reg1.edad , reg1.alt);
  86.                      fwrite(&reg1,sizeof(Tficha),1,archivobin);
  87.                       }
  88.                      
  89.                  }
  90.                  strcpy(linea,"");
  91.               }
  92.              
  93.              
  94.               fseek(archivobin,0,SEEK_END);
  95.               cantreg = ftell(archivobin)/sizeof(Tficha);
  96.               printf ("Registros encontrados : %d", cantreg);
  97.               fseek(archivobin,0,SEEK_SET);
  98.       Tficha vector[cantreg];    //  Declaro vector
  99.          // fread (vector, sizeof(Tficha),cantreg,archivobin);
  100.          i=0;
  101.          while (! feof(archivobin))
  102.          {if ( fread(&vector[i], sizeof(Tficha),1,archivobin )== 1 )
  103.          i++;
  104.                }
  105.          ordenavector (cantreg,vector,compnyaficha);
  106.  
  107.    
  108.    
  109. archivobinord = fopen ("Ordenado.dat", "wb+");
  110.    
  111. if (!archivobinord)
  112.    {printf ("No se pudo abrir el archivo Ordenado.dat \n");  
  113.    exit -1;}
  114.    else
  115.    {        
  116.          printf("\n\n\t\t DATOS ORDENADOS \n\n");
  117.          fseek(archivobinord,0,SEEK_SET);
  118.          for (i=0 ; i< cantreg ; i++)
  119.          {
  120.              fwrite(&vector[i],sizeof(Tficha),1,archivobinord);
  121.              printf( " Datos %d: %30s %6d %8.2f \n" ,i, vector[i].nya , vector[i].edad , vector[i].alt);
  122.              }          
  123.    
  124.   fclose (archivobinord);
  125.  }
  126.  
  127.       printf ("Archivo no ordenado .....  \n");
  128.       fseek(archivobin,0,SEEK_SET);
  129.       while (! feof(archivobin))
  130.          {  if ( fread(&regaux, sizeof(Tficha),1,archivobin )== 1 )
  131.                     printf( " Datos: %30s %6d %8.2f \n" , regaux.nya , regaux.edad , regaux.alt);
  132.          }  
  133.  
  134.  
  135.  
  136. printf ("\nOrdenando en archivo .....  \n");
  137.        ordenaArch(archivobin , compnyaficha );
  138.                 fseek(archivobin,0,SEEK_SET);
  139.                 printf ("Resultado Ordenar en archivo \n");
  140.        while (! feof(archivobin))
  141.          {  if ( fread(&regaux, sizeof(Tficha),1,archivobin )== 1 )
  142.                     printf( " Datos: %30s %6d %8.2f \n" , regaux.nya , regaux.edad , regaux.alt);
  143.          }  
  144.  
  145.   fclose (archivobin);
  146.   }
  147.      
  148.  
  149.   printf ("\n\nFinalizado\n\n");
  150.   system("PAUSE"); 
  151.   return 0;
  152.  
  153. }
  154.  
  155. int compnyaficha (Tficha f1, Tficha f2)
  156. {
  157. return strcmp(f1.nya,f2.nya)    ;
  158. }
  159.  
  160. void ordenavector(int tamanio , Tficha *vect, int (*funcomp)( Tficha , Tficha))
  161. {
  162. Tficha aux;
  163. int i , j;    
  164.      for (i=0 ; i<tamanio-1; i++)
  165.        for (j=i+1;j<tamanio; j++)
  166.        if ( funcomp (vect[i],vect[j])> 0 )
  167.        { // printf ("Intercambia %d-%s por %d-%s ",i,vect[i].nya, j, vect[j].nya);
  168.             aux= vect[i];
  169.             vect[i]=vect[j];
  170.             vect[j]=aux;
  171.             }
  172. }
  173.  
  174. void ordenaArch(FILE *arch ,  int (*funcomp)( Tficha , Tficha))
  175. {
  176. int i , j;
  177. Tficha reg1,reg2;
  178. int tamreg, cantreg;
  179. tamreg = sizeof(Tficha);
  180.  
  181. fseek(arch,0,SEEK_END);
  182. cantreg =ftell(arch)/tamreg;
  183.      for (i=0 ; i<cantreg-1; i++)
  184.      { fseek(arch,i*tamreg,SEEK_SET);
  185.        fread(&reg1,tamreg,1,arch);
  186.        for (j=i+1;j<cantreg; j++)
  187.          { fseek(arch,j*tamreg,SEEK_SET);
  188.            fread(&reg2,tamreg,1,arch);
  189.            if ( funcomp (reg1,reg2)> 0 )
  190.            { fseek(arch,i*tamreg,SEEK_SET);
  191.              fwrite(&reg2,tamreg,1,arch);  
  192.              
  193.              fseek(arch,j*tamreg,SEEK_SET);
  194.              fwrite(&reg1,tamreg,1,arch);
  195. //             printf ("Intercambia %d-%s por %d-%s ",i,reg1.nya, j, reg2.nya);
  196.              reg1=reg2;
  197.             }
  198.           }
  199.      }
  200.  
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement