Estoy tratando de una lectura de un único byte de un archivo binario, y estoy consiguiendo resultados inexactos.

Este es el contenido de un archivo binario:

00000000 00 04 0A 07 00 00 00 00 00 00 74 00 00 00 00 61 69 6E 62 6F 77 00 ..........t....ainbow.

El punto es que puedo leer más de un byte, pero yo simplemente no puede leer exactamente un byte. Si se trató de leer el tercer byte 0A que es igual a 10, en lugar de eso me da un valor de 32522 o en hexadecimal 7F0A. Lo que me estoy perdiendo aquí?

#include <iostream>
#include <fstream>
#include <cstring>
#include <fstream>

using namespace std;

int main()
{
    fstream file("foo.daf", ios::in | ios::out | ios::binary);

    file.seekg(2);

    int x;

    file.read(reinterpret_cast<char *>(&x), 1);

    cout<<x<<endl;

    return 0;
}
Parece como si usted va sobre él de la manera equivocada.unsigned char x; file >> x;
char c; if(file.get(c)) { /* read was successful, use c */ }
Dudo un formato de entrada de la función de lograr los resultados deseados. En el caso particular de este personaje, que sin duda no va.
esto parece ser una C++ pregunta, ¿por qué es también marcó C?

OriginalEl autor user3764893 | 2014-12-30

3 Comentarios

  1. 7

    x no está inicializado, y modificar sólo un byte, de forma que usted tiene de la basura para los otros bytes.

    Utilizar directamente el tipo correcto debería resolver su problema (y evitar un elenco).

    char x;
    He intentado como lo dijo y lo hizo imprimir nada
    ostream para un char mostrar el carácter (que es '\r' en su caso) no es el número, usted tiene que echar a un entero para ver su valor.
    ok. Que tiene sentido.

    OriginalEl autor Jarod42

  2. 6

    El código siguiente es lo que usted está buscando:

    unsigned char x;
    file.read(&x, 1);
    cout << static_cast<int>(x) << endl;

    Se lee un carácter y, a continuación, convierte a un entero.

    OriginalEl autor Ed Heal

  3. 2

    El problema es que estás leyendo un int. Un Int es de más de un byte en casi todos los sistemas. Int son comúnmente de 4 bytes, y a veces de 8 bytes. Usted realmente quiere leer en un char como el comentario anterior dice.

    int main()
    {
    
        fstream file("foo.daf", ios::in | ios::out | ios::binary);
    
        file.seekg(2);
    
        char x;
    
        file.read((&x), 1);
    
        cout<<x<<endl;
    
        return 0;
    }
    file.read(reinterpret_cast<char *>(&x), 1); <- esto lee un char (que sucede a la superposición de un int por malas razones), no un int.
    ¿Cómo puedo leer la primera x bytes y se imprime una cadena de caracteres?
    Me corrija si estoy equivocado, pero tampoco es totalmente correcta solución. char es igual a byte de acuerdo con C++ especificación, pero especificación byte no el 100% de la media de 8 bits. Así que si quieres leer de 8 bits, bytes, usted tendría que usar fija el tamaño de 8 bits tipo y el paquete de chars. Que es =(
    No estoy seguro de que int8_t puede ser admitidos en los sistemas que tienen 16 bits char aunque.

    OriginalEl autor WonderMonster

Dejar respuesta

Please enter your comment!
Please enter your name here