• Viernes 8 de Noviembre de 2024, 21:46

Autor Tema:  Como leer un archivo binario  (Leído 2778 veces)

tiwanacote

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Como leer un archivo binario
« en: Miércoles 20 de Julio de 2011, 03:43 »
0
Hola Gente, soy novato en esto y quiero saber que debería probar o modificar de mi código para poder leer un archivo binario sin que me aparezcan signos raros... ¿Que estoy haciendo mal?

¿Como podría visualizar la data en pantalla en binario o mejor en hexadecimal?

Muchas gracias

Código: C++
  1. #include <fstream>
  2. #include <iostream>
  3.  
  4.  
  5. int main()
  6. {
  7.     using namespace std;
  8.     ifstream archivo("b12.bmp", ios::binary);
  9.     char linea[128];
  10.     long contador = 0L;
  11.  
  12.     if(archivo.fail())
  13.     cout << "Error al abrir el archivo Besos.txt" << endl;
  14.     else
  15.     while(!archivo.eof())
  16.     {
  17.         archivo.getline(linea, sizeof(linea));
  18.  
  19.         cout << linea << endl;
  20.         if((++contador % 24)==0)
  21.         {
  22.             cout << "CONTINUA...";
  23.             cin.get();
  24.         }
  25.     }
  26.     archivo.close();
  27.     return 0;
  28. }

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Como leer un archivo binario
« Respuesta #1 en: Miércoles 20 de Julio de 2011, 06:33 »
0
Hola tiwanacote, para empezar, aunque estas abriendo el archvo como binario, deberias utilizar lectura de bloque (read) en lugar de lectura de linea (getline).

Otro problema esta con el operador << sobrecargado que no permite imprimir los valores de tipo char en su equivalente numerico hecadecimal.

Lo mejor seria utilizar printf, que si permite imprimir un char como si fuena un numero en formato hexadecimal.

Te dejo un codigo de ejemplo, para que te des una idea de como hacerlo, probe el codigo y funciona bien con archivos de tamaño pequeño, no se hasta que tamaño de archivo pueda abrir sin dar error, es probable que si el archivo es muy grande deberas cargarlo por partes en lugar de todo para poderlo abrir bien, te quedaria de tarea hacer esa modificacion ;)

Código: [Seleccionar]
#include <iostream>
#include <fstream>

using namespace std;


int main()
{
    // Variable que guarda el tamaño del archivo en bytes
    unsigned int length;
    // Para que printf imprima los valores de forma correcta
    // es necesario que el buffer sea unsigned char en lugar de char
    unsigned char *buffer;
    // Modifica la siguiente linea para abrir otro archivo
    char nombre_archivo[] = "unidad.txt";

    ifstream archivo(nombre_archivo, ios::binary);

    if(archivo.fail())
        cout << "Error al abrir el archivo " << nombre_archivo << endl;
    else
    {
        // obtener longitud del archivo
        archivo.seekg (0, ios::end);
        length = archivo.tellg();
        archivo.seekg (0, ios::beg);

        // obtener memoria para la variable
        buffer = new unsigned char [length];

        // leer datos como bloque
        archivo.read ((char*)(buffer),length);
        archivo.close();

        // imprimir cada posicion del buffer como hexadecimal
        for (unsigned int i = 0; i < length; i++)
        {
            // 16 valores por linea, si deseas un numero diferente
            // modifica i % 16
            if (i % 16 == 0 && i != 0)
                printf("\n");
            if (buffer[i] < 16)
                printf("0%X ", buffer[i]);
            else
                printf("%X ", buffer[i]);
        }
    }

    return 0;
}

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

tiwanacote

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re:Como leer un archivo binario
« Respuesta #2 en: Jueves 21 de Julio de 2011, 02:11 »
0
I . M . P . R . E . S . I . O . N . A . N . T . E .   Amigo! Estuve horas volviendome loco, muchas gracias de verdad! :jumpie: