std :: fstream, кажется, читает в разных размерах - PullRequest
1 голос
/ 27 февраля 2012

Я работаю над Ubuntu 10.04 и gcc. У меня есть двоичный файл с моим собственным магическим номером. Когда я читаю файл, магическое число не совпадает. Потоки швы должны быть правильными.

Написание магического числа:

std::fstream chfile;
chfile.open(filename.c_str(), std::fstream::binary | std::fstream::out);
if (chfile.good())
{
    chfile << (unsigned char)0x02 << (unsigned char)0x46 << (unsigned char)0x8A << (unsigned char)0xCE;
    // other input
    chfile.close();
}

Чтение магического числа:

std::fstream chfile;
chfile.open(filename.c_str(), std::fstream::binary | std::fstream::in);
if (chfile.good())
{
    unsigned char a,b,c,d;
    chfile >> a;
    chfile >> b;
    chfile >> c;
    chfile >> d;
    printlnn("header must : " << (int)0x02 << ' ' << (int)0x46 << ' ' << (int)0x8A << ' ' << (int)0xCE); // macro for debugging output
    printlnn("header read : " << (int)a << ' ' << (int)b << ' ' << (int)c << ' ' << (int)d);
    chfile.close();
}

Когда я использую 02 46 8A CE в качестве магического числа, все в порядке (как говорится в выводе):

header must : 2 70 138 206
header read : 2 70 138 206

но когда я использую EA 50 0C C5, получается:

header must : 234 80 12 197
header read : 234 80 197 1

и последний 1 является допустимым значением для следующего ввода. Так чем они отличаются и как мне это исправить?

Ответы [ 2 ]

3 голосов
/ 27 февраля 2012

Во втором случае operator>> пропускает значение символа 12. operator>> распознает 12 как пробел и пропускает его, ища следующий действительный символ.

Попробуйте использовать неотформатированныйвместо этого введите операцию ввода (например, chfile.read() или chfile.get()).

1 голос
/ 27 февраля 2012

Вы не должны использовать << и >> с двоичными файлами, они используются для форматированного чтения и записи.
В частности, они выполняют специальную обработку пробелов, таких как 0xC (т.е. formfeed), что делаетони не подходят для бинарного ввода-вывода.

...