прочитать весь двоичный файл в буфер, а затем разрешить его в определенном формате - PullRequest
0 голосов
/ 25 сентября 2018

Вот моя домашняя работа на C ++.Данный бинарный файл состоит из нескольких блоков данных.Каждый блок данных состоит из двух частей.Первая часть - 1 char, а вторая - 1 int.Читайте весь файл в буфер за раз, а затем извлекайте все блоки данных из буфера.Теперь я успешно прочитал файл в буфер следующим образом:

char* readBinaryFile(const char* fileName) {
    ifstream file(fileName, ios::binary || ios::ate);

    // get the size of file
    streampos beg, end;
    beg = file.tellg();
    file.seekg(0,ios::end);
    end = file.tellg();
    long size = end - beg;

    char* buffer = new char[size];

    // now read the file into buffer
    file.seekg(0, ios::beg);
    file.read(buffer, size);
    file.close();

    return buffer;
}

Итак, моя проблема в том, как я могу получить блок данных из буфера?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Может ли ваша проблема возникать из-за того, что вы используете:

ios::binary || ios::ate

, когда я думаю, что вы имеете в виду:

ios::binary | ios::ate

Первый из них оценивается как "1", так как двоичныйлогический-или-конец-это «истина», последний битовая маска, которая говорит «откройте этот файл в двоичном режиме, и в конце».То, как вы это написали, на самом деле эквивалентно

ios::app
0 голосов
/ 25 сентября 2018

Я не собираюсь писать код для вас, но подумайте немного об этом ...

У buffer[0] ваш первый символ.На buffer[1] через buffer[4] это ваш первый int.Он повторяется, поэтому buffer[5] является символом для второго набора данных.

Есть пять байтов для символа и целого числа вместе.Если вы знаете количество прочитанных данных, вы можете разделить их на 5 и узнать количество имеющихся «наборов» данных.

Теперь вы можете использовать что-то вроде цикла for для итерации.от нуля до числа множеств минус один.Допустим, эта переменная итератора i, тогда вы можете получить доступ к символу каждого "набора" данных с помощью buffer[i * 5], первого байта целого числа в buffer[i * 5 + 1] и т. Д.

Итак,цикл for и немного математики помогут вам извлечь информацию из этого буфера.У вас будет 5 отдельных байтов, и вам нужно собрать 4 из этих байтов обратно в int.Для этого есть множество способов, которые я попытаюсь обнаружить.

...