• Miércoles 6 de Noviembre de 2024, 03:00

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - sergio_ink

Páginas: [1]
1
C/C++ / Re: Escribir Un Archivo Binario
« en: Domingo 13 de Enero de 2008, 21:16 »
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 <stdio.h>
  3. #include <stdlib.h>
  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("Este programa recibio arumentos\nOpcion para resetear");
  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("lista","w+b");
  33.     atm1 = fopen("atm1.txt","w+");
  34.     atm2 = fopen("atm2.txt","w+");
  35.  
  36.     /*INICIO - Rellenado de lista con valores 0xFF */
  37.     for(numeroIP=0; numeroIP<=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("lista","r+b");
  46.     //Mover aleatoriamente los numeros
  47.     numeroIP=0;      //Reseteo a cero.
  48.     while(numeroIP <= 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("El lugar actual NO esta ocupado\n");
  74.          break;
  75.       }
  76.       else
  77.       {
  78.          printf("El lugar actual SI esta ocupado\n");
  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("Retoceder al principio\n");
  85.            rewind(lista);
  86.          }
  87.          else
  88.          {
  89.            printf("Se a avanzado un byte\n");
  90.            system("PAUSE");
  91.          }
  92.       }
  93.          }
  94.        }
  95.        else
  96.        {
  97.          printf("Error al posicionar el apuntador lista aleatoriamente\n");
  98.          system("PAUSE");
  99.          exit(1);
  100.        }
  101.   system("PAUSE");
  102.   fseek(lista,-1,SEEK_CUR);
  103.   putc(numeroIP,lista);
  104.   printf("\n numeroIP=  %d  ",numeroIP);
  105.   printf("\n  numeroAzar= %d ", temporal);
  106.   numeroIP++;
  107.     }
  108.     /* FIN    - Algoritmo para desordenar*/
  109.     printf("Salida");
  110.  
  111.     if ( fclose(lista) || fclose(atm1) || fclose(atm2)  != 0)
  112.        printf("Error al cerrar un archivo");
  113.     else printf("Cierre corecto de todos los archivos");
  114.  
  115.     system("PAUSE");
  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 <= 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.

2
C/C++ / Re: Escribir Un Archivo Binario
« en: Domingo 13 de Enero de 2008, 18:17 »
: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("  %d  ",numeroIP);
  4. printf("\n  numeroAzar= %d ", temporal);
  5.  
  6.  

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

3
C/C++ / Re: Escribir Un Archivo Binario
« en: Domingo 13 de Enero de 2008, 06:04 »
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.

4
C/C++ / Escribir Un Archivo Binario
« en: Domingo 13 de Enero de 2008, 06:01 »
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:

Páginas: [1]