Файл не читается правильно в двоичном режиме C ++ - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть двоичный файл со следующими данными,

10110100
11111001
01110001

, и я использовал этот код для его чтения,

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string in;
    cin>>in;
    ifstream input(in.c_str(),ios::in | ios::binary);
    if(!input.is_open())
    {
        cout<<"oops!!"<<endl;
        return 0;
    }
    cout<<"OK!!"<<endl;
    char a;
    while(input.get(a))
    {
        string s="";
        int b=a,c=0;
        while(b!=0)
        {
            c++;
            s+=(b%2?'1':'0');
            b/=2;
        }
        s+=string(8-c,'0');
        for(int i=s.length()-1;i>=0;i--)
            cout<<s[i];
        cout<<endl;
    }
    cout<<endl<<"DONE!!"<<endl;
}

, который в основном читает символ, 1 байт, из файл с использованием функции get() и выводит его в виде двоичного представления. Я также попробовал read(), но это не сработало. Если это помогает, я получаю следующий вывод:

01001100
00000111
01110001

Других данных в файле нет, я проверил с помощью бинарного редактора. Какая у меня проблема?

1 Ответ

1 голос
/ 11 февраля 2020

10110100 равно 180.

На большинстве платформ char - это 8-разрядное число со знаком в диапазоне от -128 до 127.

Когда вы читаете в 10110100 a установлен на -76.

76 - это 01001100 в двоичном формате, который соответствует вашему выводу.

Изменение char на unsigned char должно решить вашу проблему :

unsigned char a;
while(input.read(reinterpret_cast<char*>(&a), 1))
...