• Sábado 14 de Diciembre de 2024, 17:39

Autor Tema:  Escribir Un Archivo Binario  (Leído 2987 veces)

sergio_ink

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Escribir Un Archivo Binario
« en: Domingo 13 de Enero de 2008, 06:01 »
0
Hola. :hola:
Estoy tratando de realizar un programa que maniipula archivos en modo binario.
Es mi primer experiencia manipuando archivos. Ya entiendo como usar FILE, fopen, fclose. pero no he podido entender como manipular la posicion del puntero FILE.

Este es el codigo que llevo desarrollando actualmente:

====================================================
#include <stdio.h>
#include <stdlib.h>

int numeroIP=0;     //Cantidad de #IPs que generara.

    FILE *temp;
    FILE *lista;                        //todos los numero del 254-0 en Hex.

unsigned char c;
unsigned char temp_char;
unsigned char lista_char;
unsigned int temporal;

int main(int argc, char *argv[])
{
    //INICIO - Prevencion: se ejecuta sin parámetro alguno.

    //Si el archivo existe, se destruye su contenido.
    //Crear archivo de texto para lectura/escritura.
    //Si el archivo no exite, se crea;
    //Si el archivo existe, se destruye su contenido.
    lista = fopen("lista","w+b");
    temp = fopen("temp","w+b");


    /*INICIO - Generacion de numero al azar del 0 al 254 */
    numeroIP = 0;
    while(numeroIP<=254)
    {
    putc((char)numeroIP,temp);
         putc((char)255,lista);
    numeroIP++;
    }
    /* FIN   - Generacion de numero al azar del 0 al 254 */

    /* INICIO - Algoritmo para desordenar*/
    rewind(temp);         //reinicializa el indicador de posicion al principio.

    //Mover aleatoriamente los numeros
    numeroIP=0;      //Reseteo a cero.

    while(numeroIP <= 254)
    {
        c = getc(temp);   //obtener letra de temp
        rewind(lista);
        //Obtener un numero de 0-254 corresponde al lugar a guardar.
        temporal = (int) (254*rand()/(RAND_MAX+1.0));

        if( fseek(lista,(long)temporal,SEEK_CUR) == 0 )
        {
          while(1)
          {
        lista_char = getc(lista);
        if(lista_char == 255)
        {
           printf("El lugar actual NO esta ocupado");
           break;
        }
        else
        {
           printf("El lugar actual SI esta ocupado");
           //Se procede a buscar un luga vacio, DESPALAZANDOSE UN BYTE,
           //APARTIR DE LA POSICION ANTERIOR.
           if( fseek(lista,1,SEEK_CUR)!= 0 )
           {
             //Ocurrio un error.
             printf("Retoceder al principio");
             rewind(lista);
           }
           else
           {
             printf("Se a avanzado un byte\n");
             system("pause");
           }
        }
          }
        }
        else
        {
          printf("Error al posicionar el apuntador lista aleatoriamente");
          system("pause");
          exit(1);
        }


   putc(c,lista);
   printf("  %d  ",numeroIP);
   printf("\n  numeroAzar= %d ", temporal);
   numeroIP++;
    }
    /* FIN    - Algoritmo para desordenar*/
    printf("Salida");

    if ( fclose(lista) || fclose(atm1) || fclose(atm2) ||
         fclose(temp) || fclose(config) != 0)
            printf("Error al cerrar un archivo");
    else printf("Cierre corecto de todos los archivos");

    system("PAUSE");
    return 0;
 }
====================================================

Para mi que esta completo el programa. :rolleyes:
Lo que si hace: :smartass:
  - crea los cuatro archivos
  - llena con bytes el archivo temp con numeros del 0 al 254 --> 0xFE hexadeciamal
  - llena el archivo lista con bytes con valor de 255 decimal --> 0xFF hexadecimal

Lo que no hace: :devil:
  - Tomar secuencialmente, uno por uno, los bytes del archivo temp y copiarlo sobre alguna ubicacion del archivo lista.
  - la ubicacion debe ser selecionada aleatoriamente y remplazar al 0xFF hexadeciamal.

Un 0xFF en el archivo lista le debe inicar al programa que ese byte no ha sido utilizado para uno de los numero tomasdos de temp.

He adjuntado algunas imagenes de captura de pantalla del escritorio de mi editor  hexadecimal.

ttp://img266.imageshack.us/my.php?image=generalex9.jpg
tp://img142.imageshack.us/my.php?image=listafi1.jpg
ttp://img142.imageshack.us/my.php?image=temprc8.jpg
Les agrececeria mucho. :hola:

sergio_ink

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Escribir Un Archivo Binario
« Respuesta #1 en: Domingo 13 de Enero de 2008, 06:04 »
0
Disculpen si inie la discusion pero hoy, aqui donde vivo es de noche asi que no podre estar dsiponible hasta el dia de mañana.

patitofeo

  • Miembro MUY activo
  • ***
  • Mensajes: 145
    • Ver Perfil
Re: Escribir Un Archivo Binario
« Respuesta #2 en: Domingo 13 de Enero de 2008, 15:50 »
0
Código: Text
  1.  
  2.     while(numeroIP &#60;= 254)
  3.     {
  4.        c = getc(temp);   //obtener letra de temp
  5.        rewind(lista);
  6.        //Obtener un numero de 0-254 corresponde al lugar a guardar.
  7.        temporal = (int) (254*rand()/(RAND_MAX+1.0));
  8.  
  9.        if( fseek(lista,(long)temporal,SEEK_CUR) == 0 )
  10.        {
  11.          while(1)
  12.          {
  13.       lista_char = getc(lista);
  14.       if(lista_char == 255)
  15.       {
  16.          printf(&#34;El lugar actual NO esta ocupado&#34;);
  17.          break;
  18.       }
  19.       else
  20.       {
  21.          printf(&#34;El lugar actual SI esta ocupado&#34;);
  22.          //Se procede a buscar un luga vacio, DESPALAZANDOSE UN BYTE,
  23.          //APARTIR DE LA POSICION ANTERIOR.
  24.          if( fseek(lista,1,SEEK_CUR)!= 0 )
  25.          {
  26.            //Ocurrio un error.
  27.            printf(&#34;Retoceder al principio&#34;);
  28.            rewind(lista);
  29.          }
  30.          else
  31.          {
  32.            printf(&#34;Se a avanzado un byte&#092;n&#34;);
  33.            system(&#34;pause&#34;);
  34.          }
  35.       }
  36.          }
  37.        }
  38.        else
  39.        {
  40.          printf(&#34;Error al posicionar el apuntador lista aleatoriamente&#34;);
  41.          system(&#34;pause&#34;);
  42.          exit(1);
  43.        }
  44.  
  45.  
  46.   putc(c,lista);
  47.   printf(&#34;  %d  &#34;,numeroIP);
  48.   printf(&#34;&#092;n  numeroAzar= %d &#34;, temporal);
  49.   numeroIP++;
  50.  
  51.  

En esta sección de código creo que tienes un fallo.

No me he detenido mucho, asi que compruebalo. Tampoco se si es el único fallo.

Tu seleccionas la posición en la que quieres insertar el número y compruebas si ya habías insertado uno antes con

Código: Text
  1.  
  2.  lista_char = getc(lista);
  3.  
  4.  

si esta libre (es 255) introduces el dato

Código: Text
  1.  
  2.   putc(c,lista);
  3.  
  4.  

Lo que pasa es que no vuelves el cursor a su posición. Al leer con getc el cursor pasará a la posición siguiente e introduciras el dato en la siguiente posición.

Creo que te faltaria algo asi:
Código: Text
  1.  
  2. fseek(lista, -1,SEEK_CUR)
  3. putc(c,lista);
  4.  
  5.  

Espero haberte ayudado.

Un saludo

sergio_ink

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Escribir Un Archivo Binario
« Respuesta #3 en: Domingo 13 de Enero de 2008, 18:17 »
0
:D patitofeo, gracias por esa gran observacion.
Si, tienes razon, cuando lee un caracter con getc se avanza un lugar y uzando un retrocezo logre hacer que se escribieran los 6 primeros numeros, osea que solo funciono 6 veces el algoritmo.

Me escribio del 00 al 05 segun yo creo en lugares aleatorios, aunque, ya visto en el editor hexadecimal, estaban separados unicamente por un byte de separacion y se veian consecutivos, los demas lugares seguian siendo 0xFF.

--

Lo volvia a compilar pero algo raro pasa con la gereracion del numero aleatorio.
como se puede observar utilizo:

Código: Text
  1. temporal = (int) (254*rand()/(RAND_MAX+1.0));
  2.  


..para generar un numero al azar el cual debera ser el lugar del numero.

pero el la parte donde escribo el caracter, hago imprimir en pantalla el numeroIP y temporal (el que guarda el numero al azar de 0-254)

Código: Text
  1.  
  2. putc(c,lista);
  3. printf(&#34;  %d  &#34;,numeroIP);
  4. printf(&#34;&#092;n  numeroAzar= %d &#34;, temporal);
  5.  
  6.  

y resulta que numeroIP si esta incrementando pero temporal no cambia de valor, siempre vale 0. ¿Tiene que ver srand?

sergio_ink

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Escribir Un Archivo Binario
« Respuesta #4 en: Domingo 13 de Enero de 2008, 21:16 »
0
NUEVA REVISION

Hola a todos he revisado el programa y denuevo  :)  me he dado cuenta que no necesito el archivo llamado temp, por lo que eliminé unas cuantas lineas de código y lo remplace todo lugar donde era usado de temp a numeroIP (eran practicamente el mismo numero cuando son incrementales apartir de cero a 254).

Código: Text
  1.  
  2. #include &#60;stdio.h&#62;
  3. #include &#60;stdlib.h&#62;
  4.  
  5. int numeroIP=0;     //Cantidad de #IPs que generara.
  6.  
  7.     FILE *temp;
  8.     FILE *lista;                        //todos los numero del 254-0 en Hex.
  9.     FILE *config;                       //Informacion importante.
  10.     FILE *atm1;
  11.     FILE *atm2;
  12. unsigned char c;
  13. unsigned char temp_char;
  14. unsigned char lista_char;
  15. int temporal;
  16.  
  17. int main(int argc, char *argv[])
  18. {
  19.     //INICIO - Prevencion: se ejecuta sin parámetro alguno.
  20.  
  21.     if (argc!=1)
  22.     {
  23.     printf(&#34;Este programa recibio arumentos&#092;nOpcion para resetear&#34;);
  24.     exit(1);
  25.     }
  26.     //FIN   - Prevencion: se ejecuta sin parámetro alguno.
  27.  
  28.     //Si el archivo existe, se destruye su contenido.
  29.     //Crear archivo de texto para lectura/escritura.
  30.     //Si el archivo no exite, se crea;
  31.     //Si el archivo existe, se destruye su contenido.
  32.     lista = fopen(&#34;lista&#34;,&#34;w+b&#34;);
  33.     atm1 = fopen(&#34;atm1.txt&#34;,&#34;w+&#34;);
  34.     atm2 = fopen(&#34;atm2.txt&#34;,&#34;w+&#34;);
  35.  
  36.     /*INICIO - Rellenado de lista con valores 0xFF */
  37.     for(numeroIP=0; numeroIP&#60;=254; numeroIP++)
  38.     {
  39.        putc((char)255,lista);
  40.     }
  41.     fclose(lista);
  42.     /* FIN - Rellenado de lista con valores 0xFF */
  43.  
  44.     /* INICIO - Algoritmo para desordenar*/
  45.     fopen(&#34;lista&#34;,&#34;r+b&#34;);
  46.     //Mover aleatoriamente los numeros
  47.     numeroIP=0;      //Reseteo a cero.
  48.     while(numeroIP &#60;= 254)
  49.     {
  50.        rewind(lista);
  51.        //Obtener un numero de 0-254 corresponde al lugar a guardar.
  52.        srand(numeroIP);
  53.        temporal = numeroIP;
  54.        //temporal = (int) (254*rand()/(RAND_MAX+1.0));
  55.  
  56.        if( fseek(lista,(long)temporal,SEEK_CUR) == 0 )
  57.        {
  58.          while(1)
  59.          {
  60.       lista_char = getc(lista);   //obtener letra de temp
  61.  
  62.       if ( feof(lista)  )
  63.       {
  64.       //Error, alcanzado final de archivo.
  65.       rewind(lista);
  66.       //Neceario avanzar un byte para la proxima escritura
  67.       fseek(lista,1,SEEK_CUR);
  68.  
  69.       }
  70.  
  71.       if(lista_char == 255)
  72.       {
  73.          printf(&#34;El lugar actual NO esta ocupado&#092;n&#34;);
  74.          break;
  75.       }
  76.       else
  77.       {
  78.          printf(&#34;El lugar actual SI esta ocupado&#092;n&#34;);
  79.          //Se procede a buscar un luga vacio, DESPALAZANDOSE UN BYTE,
  80.          //APARTIR DE LA POSICION ANTERIOR.
  81.          if( fseek(lista,1,SEEK_CUR)!= 0 )
  82.          {
  83.            //Ocurrio un error.
  84.            printf(&#34;Retoceder al principio&#092;n&#34;);
  85.            rewind(lista);
  86.          }
  87.          else
  88.          {
  89.            printf(&#34;Se a avanzado un byte&#092;n&#34;);
  90.            system(&#34;PAUSE&#34;);
  91.          }
  92.       }
  93.          }
  94.        }
  95.        else
  96.        {
  97.          printf(&#34;Error al posicionar el apuntador lista aleatoriamente&#092;n&#34;);
  98.          system(&#34;PAUSE&#34;);
  99.          exit(1);
  100.        }
  101.   system(&#34;PAUSE&#34;);
  102.   fseek(lista,-1,SEEK_CUR);
  103.   putc(numeroIP,lista);
  104.   printf(&#34;&#092;n numeroIP=  %d  &#34;,numeroIP);
  105.   printf(&#34;&#092;n  numeroAzar= %d &#34;, temporal);
  106.   numeroIP++;
  107.     }
  108.     /* FIN    - Algoritmo para desordenar*/
  109.     printf(&#34;Salida&#34;);
  110.  
  111.     if ( fclose(lista) || fclose(atm1) || fclose(atm2)  != 0)
  112.        printf(&#34;Error al cerrar un archivo&#34;);
  113.     else printf(&#34;Cierre corecto de todos los archivos&#34;);
  114.  
  115.     system(&#34;PAUSE&#34;);
  116.     return 0;
  117. }
  118.  
  119.  
  120.  

actualmente el programa:
  - Crea el fichero lista.
  - cuando:
 
Código: Text
  1.  
  2.     //Mover aleatoriamente los numeros
  3.     numeroIP=0;      //Reseteo a cero.
  4.     while(numeroIP &#60;= 254)
  5.  
  6.  
 es igual a cero escribe en lista desde la primera posicion (puntero = 0 ) hasta el ultimo 0xFE. Si le cambio numeroIP=1 todavia funciona, pero si le pongo numeroIP=4 ya no funciona y  supongo que si es un numero más grande que sera generado por:
Código: Text
  1. temporal = (int) (254*rand()/(RAND_MAX+1.0));
  2.  
deberá fallar tambien. Revisare esto posteriormente.

NOTA: Desabilite :
 
Código: Text
  1.  
  2. srand(numeroIP);
  3. temporal = numeroIP;
  4. //temporal = (int) (254*rand()/(RAND_MAX+1.0));
  5.  
  6.  
porque no me genera numeros al azar, solo me genera cero en cada vuelta.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.