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.
Lo que si hace:
- 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:
- 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.jpgtp://img142.imageshack.us/my.php?image=listafi1.jpgttp://img142.imageshack.us/my.php?image=temprc8.jpgLes agrececeria mucho.