/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

ayuda binaria

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
EgLoMeR



Registrado: 10 Sep 2006
Mensajes: 15

MensajePublicado: 20/09/2007 4:22 pm
Título: ayuda binaria

Hola a todos:

Estoy creando un programa para pasar lecturas binarias de archivos a decimales, a ver si podéis ayudarme.

Lo que busco exactamente es una función a la que, pasándole un FILE* sea capaz de decirme los 0 y 1 que componen dicho FILE* pero al revés, es decir, que primero me muestre el último byte del archivo y por último, el primero.

He probado con esto:
Código:
FILE *archivo, *salida;
   char *datos                       // datos del archivo
   long tamano = 0;         // tamaño del archivo
   

// Abre archivo de entrada como solo lectura en modo binario
      if ((archivo = fopen(argv[2],"rb")) == NULL){
         printf ("Error al abrir archivo de entrada %s", argv[2]);
         return 0;
      }

      // Nos ponemos al final del archivo una vez abierto
      fseek (archivo, 0, SEEK_END);

      // Sacamos el tamaño del archivo en bytes
      tamano = ftell (archivo);
      
      // Volvemos al inicio del archivo
      rewind (archivo);

      // Comprobamos que el archivo no esté vacío
      if (tamano <= 0){
         fclose (archivo);   // Cerramos archivo
         printf ("El archivo %s está vacío", argv[2]);
         return 0;
      }

               // Asignación de memoria dinámica      
      datos = new char[(tamano + 1)];
      
      // Lectura del archivo y cierre
      fread (datos, 1, tamano, archivo);
      fclose (archivo);

      // Pasamos la cadena datos a decimal     
      decimal (tamano, datos, conta);


y esta ultima funcion usa un bucle for para leer al revés desde la cadena datos, pero no me va. alguna ayuda?

SO WinXP SP2
compilador Visual C++ 6
Volver arriba
DCelso



Registrado: 28 Abr 2004
Mensajes: 112

MensajePublicado: 20/09/2007 5:13 pm
Título:

Es muy dificil puesto que un FILE siempre es una lectura secuencial descendente. Se podría hacer dos cosas:
La primera seria situarse al final del fichero con fseek( fichero, -1L, SEEK_END );
luego hacer un bucle que:
* lea y muestre un byte c=fgetc(archivo); printf("%c".c);
* y luego se situe dos posiciones a atrás, la que leyó y mostró y la que leerá y mostrara en la siguiente iteración fseek( fichero, -2L, SEEK_CUR);
hasta llevar a estár en la primera posicion ftell( fichero )==0
(Un poco cutre, la verdad)

La otra opción es meter el archivo en un vector de bytes y leer éste de detrás hacia delante.

Código:

FILE *archivo;
        char *caracteres;
        long int comienzo, longitud,i;
        int contadores[3]={0,0,0};

        archivo=fopen("entrada.txt","rb");
        fseek( archivo, 0L, SEEK_END );
        longitud = ftell( archivo );
        rewind( archivo );
        caracteres= (char*) malloc(longitud);
        fread( caracteres, 2, longitud, archivo );
        fclose(archivo);

        for (i=longitud-1;i>0;--i) {

printf("%c".caracteres[i]);
        }


Cabe la remota posibilidad de que se pueda invertir la lectura secuencial de un FILE para que el fget retrocediera en vez de avanzar, pero lo dudo. Si alguien lo sabe que lo diga.
Venga suerte.
Volver arriba
EgLoMeR



Registrado: 10 Sep 2006
Mensajes: 15

MensajePublicado: 21/09/2007 3:22 am
Título:

Hola DCelso, muchísimas gracias por tu respuesta.

El problema es que tu código lo que me pasa a caracteres son los caracteres que tiene el .txt, y yo lo que quiero que almacene dentro de ese vector es la cadena de 0 y 1 que componen dicho archivo. Alguna idea?

Gracias.
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1372
Ubicación: En ecx esperando un call

MensajePublicado: 21/09/2007 4:16 am
Título:

Creo que te falta algo de iniciativa.
Una vez que tienes el array que compone el fichero puedes visualizar los bits de cada caracter pasandolo por una funcion del estilo
Código:
#include <stdio.h>
#include <limits.h>
#define BT(v, p)   ((v) & 1 << (p)) ? '1' : '0'
#define LIM sizeof(char) * CHAR_BIT; 

void desbit(char  *s)
{
int i = LIM;
   
    do {
       
        while(i--) putchar( BT(*s,i) );
           
        putchar('\n');
        i = LIM; 
   
     }while(*s++);
}


S2.
_________________
- Explícito es mejor que implícito.
- Simple es mejor que complejo.
- Complejo es mejor que complicado.
- Plano es mejor que anidado.
- Ralo es mejor que denso.
Volver arriba
Karman



Registrado: 15 Oct 2005
Mensajes: 308

MensajePublicado: 21/09/2007 6:06 am
Título:

si lo que quieres es obtener los datos en el orden inverso al del archivo... se puede usar una pila:

Código:

typedef struct Nodo{//Registro lista...
  char txt;
  struct Nodo *sig;
}*ND;
ND Q,P=NULL,PRIM=NULL;//Lista
FILE *fp;char *Fname;
/*****************************/
fp=fopen("lista.txt","r");
if(!fp)return false;
while(!feof(fp)){
   P = (ND)malloc(sizeof(Nodo));
   P->txt=fgetc(fp);
   P->sig=PRIM;
   PRIM=P;
}

Q=(ND)PRIM;
printf("\n\n");
while(Q!=NULL){
   P=Q->sig;
   printf("%c",Q->txt);
   free(Q);Q=P;
}
fclose(fp);
/************************/


S2
_________________
www.inexinferis.co.nr

-. Karman .-
Volver arriba
DCelso



Registrado: 28 Abr 2004
Mensajes: 112

MensajePublicado: 21/09/2007 7:56 am
Título:

Es muy estraño lo que pretendes hacer. Con toda la información de este post he sacado esta posible solucion
Código:


void pasar_a_base2_invertida(int i_numero, char * salida)
{
        int cociente = i_numero;
        int resto=0;
        int i=0;
        while (cociente >= 2) {
                resto=cociente%2;
                cociente=cociente/2;
                salida[i++]=(char)('0'+resto);
        }
        salida[i++]=(char)('0'+cociente);
        salida[i]=0;
}


typedef struct Nodo
{
        int txt;
        struct Nodo *sig;
}
*ND;

////////
        ND Q,P=NULL,PRIM=NULL;//Lista
        FILE *fp;
        int i,c;
        char buffer[255];
        fp=fopen("lista.txt","rb");
        if(!fp)
                return false;

        printf("Al as: ");
        while((c=fgetc(fp))!=EOF) {
                pasar_a_base2_invertida(c,buffer);
                for (i=strlen(buffer)-1;i>=0;--i) {
                        printf("%c",buffer[i]);
                }
                P = (ND)malloc(sizeof(Nodo));
                P->txt=c;
                P->sig=PRIM;
                PRIM=P;
        }
        Q=(ND)PRIM;
        printf("\n\n");
        printf("Al reves: ");
        while(Q!=NULL) {
                P=Q->sig;
                pasar_a_base2_invertida(Q->txt,buffer);
                printf("%s",buffer);
                free(Q);
                Q=P;
        }
        fclose(fp);
/////////////////

Ya me contarás si te ha servido
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 21/09/2007 8:45 am
Título:

EgLoMeR escribió:
El problema es que tu código lo que me pasa a caracteres son los caracteres que tiene el .txt, y yo lo que quiero que almacene dentro de ese vector es la cadena de 0 y 1 que componen dicho archivo.

Llamame obtuso pero sigo sin entender cual es la estructura exacta del archivo.

Tu objetivo es procesarlo como una secuencia de:

A) enteros cada uno con un tamaño de N bytes.
B) caracteres.
C) bits donde cada byte esta constituido de N bits.

En mi opinion para imprimir la secuencia al reves la forma mas corta es mediante una funcion recursiva y la mas sencilla mediante un bloque de memoria ya sea estatico (un array) o dinamico (malloc et al o (mejor todavia) el par new + delete).

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
EgLoMeR



Registrado: 10 Sep 2006
Mensajes: 15

MensajePublicado: 22/09/2007 4:32 am
Título:

muchísimas gracias a todos, la verdad esq estáis hechos unos fieras en esto (no como yo... xD)

DCelso, eso es precisamente lo que quería, solo que en vez de salirme los 8 bits de cada caracter me salen 7 (se come el 0 del principio), pero ya estoy trabajando en ello.

Muchas gracias Kartman, cheroky y DCelso!
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com