C ++ ifstream прочитает некоторые значения и остановится - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь написать программу, которая читает 940 4-байтовых длинных значений двоичных данных [hex] из файла bin и выводит значения на консоль.У меня есть операции ifstream :: read, cout и seekg в цикле.

Он будет работать в течение первых 10 или около того итераций, а затем за одну итерацию пропустить операции чтения и записи, предварительно выполнить операцию поиска и продолжить чтение и запись.Кроме того, последние 200 строк или около того выдают одно и то же значение.

Он будет работать правильно в течение 12 итераций, затем начнет выводить неправильные числа.В этот момент он идет от адреса 0x230 до 0x28B, когда он должен быть в 0x260.Похоже, что read и cout не вызываются в этой конкретной итерации.

Последнее правильное значение - 3f4fc938.Следующее значение должно быть 3ef646c1.

Кто-нибудь знает, почему это не получится?Любая помощь приветствуется.

Это программа:

int main(int argc, char* argv[]) {
    fstream in;
    uint32_t buffer;
    in.open(argv[1]);
    in.seekg(0x6500,in.beg);
    for(int i = 0; i < 940; i++) {
        in.read(reinterpret_cast<char*> (&buffer),4);
        cout << hex << buffer << endl;
        in.seekg(0x2c,in.cur);
    }
}

1 Ответ

0 голосов
/ 10 декабря 2018

Вы открыли свой файл в текстовом режиме.Текстовый режим означает, что операции с файлом будут интерпретировать последовательность байтов, которая соответствует представлению новой строки для конкретной платформы, как один символ '\n'.Например, если вы работаете в Windows, символы новой строки представляются в виде последовательности байтов 0D 0A.Таким образом, в Windows все, что вы делаете в своем файле, будет работать до того момента, когда в вашем файле будет байт со значением 13, за которым следует байт со значением 10. Как только вы достигнете этой точки, то 13, а затем 10 будут интерпретироватьсякак один персонаж.По сути, текстовый режим просто поглотит любой байт со значением 13, если он появится непосредственно перед байтом со значением 10. Ваше приложение никогда не увидит 13 и все, что находится за пределами точки, где появилось 13, в конечном итоге будет «смещено» на один байт.,На других платформах другие представления новой строки являются общими.Если вы хотите работать с двоичными данными, вы, как правило, хотите открыть свой файл в двоичном режиме, например

fstream in(argv[1], std::ios::binary);

или

in.open(argv[1], std::ios::binary);
...