Проблема чтения двоичного файла в C ++ - PullRequest
3 голосов
/ 05 августа 2011

Я делал функцию для чтения файла, содержащего некоторые сброшенные данные (последовательность значений из 1 байта). Поскольку сбрасываемые значения составляли 1 байт каждое, я читал их как символы. Я открыл файл в двоичном режиме, прочитал данные как символы и произвел приведение к int (так что я получил коды ascii). Но данные читаются не правильно (по сравнению в hex-редакторе). Вот мой код:

int** read_data(char* filename, int** data, int& height, int& width)
{
    data=new int*[height];
    int row,col;
    ifstream infile;
    infile.open(filename,ios::binary|ios::in);
    if(!infile.good())
    {
        return 0;
    }
    char* ch= new char[width];
    for(row=0; row<height; row++)
    {
        data[row]=new int[width];
        infile.read(ch,width);
        for(col=0; col<width; col++)
        {
            data[row][col]=int(ch[col]);
            cout<<data[row][col]<<" ";
        }
        cout<<endl;
    }
    infile.close();
    return data;
}

Есть идеи, что может быть не так с этим кодом? У меня машина windows, я использую Visual Studio 2005 и (точное) имя файла, которое я передал:

"D:\\files\\output.dat"

РЕДАКТИРОВАТЬ : Если я не использую unsigned char, первые 8 значений, которые все 245, читаются как -11.

Ответы [ 3 ]

3 голосов
/ 05 августа 2011

Я думаю, вам, возможно, придется использовать unsigned char и unsigned int, чтобы получить правильные результаты. В вашем коде прочитанные байты интерпретируются как подписанные значения. Я полагаю, вы этого не хотели.

1 голос
/ 05 августа 2011

Кажется, ваша ошибка связана с использованием char* для ch. Когда вы пытаетесь вывести его, все символы печатаются до первого нулевого значения.

0 голосов
/ 05 августа 2011

Обычный char может быть подписанным или без знака, в зависимости от компилятора.Чтобы получить согласованный (и правильный) результат, вы можете привести значение к unsigned char перед присвоением int.

data[row][col]=static_cast<unsigned char>(ch[col]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...