чтение шестнадцатеричных значений из fstream в int - PullRequest
1 голос
/ 05 апреля 2011

У меня есть текстовый файл с шестнадцатеричным значением в каждой строке.Что-то вроде

80000000
08000000
0a000000

Теперь я пишу код на C ++, чтобы прочитать его напрямую.Что-то вроде

fstream f(filename, ios::in);

while(!f.eof)
{
    int x;
    char ch;
    f>>std::hex>>x>>ch;  // The intention of having ch is to read the '\n'
}

Теперь это работает не так, как ожидалось.В то время как некоторые числа заполняются правильно, логика ch ошибочна.Кто-нибудь может сказать мне правильный способ сделать это.Мне нужно заполнить массив с помощью эквивалента int.

Ответы [ 4 ]

5 голосов
/ 05 апреля 2011

Это работает:

#include <iostream>
#include <fstream>

int main()
{
    std::ifstream f("AAPlop");

    unsigned int a;
    while(f >> std::hex >> a)   /// Notice how the loop is done.
    {
        std::cout << "I("<<a<<")\n";
    }
}

Примечание. Мне пришлось изменить тип a на unsigned int, потому что он переполняет int и, таким образом, вызывает сбой цикла.

80000000:

В качестве шестнадцатеричного значения это устанавливает старший бит 32-битного значения.Который в моей системе переполняет int (sizeof (int) == 4 в моей системе).Это устанавливает поток в плохое состояние, и дальнейшее чтение не работает.В цикле OP это приведет к бесконечному циклу, так как EOF никогда не устанавливается;в приведенном выше цикле он никогда не войдет в основной текст, а код завершится.

1 голос
/ 05 апреля 2011

fstream :: operator >> игнорирует пробелы, поэтому вам не нужно заботиться о том, чтобы есть новую строку.

0 голосов
/ 05 апреля 2011

Как уже упоминалось, извлечение пробелов вручную в показанном вами коде не нужно.Однако, если в будущем вы столкнетесь с необходимостью, вы можете сделать это с помощью манипулятора std::ws.

0 голосов
/ 05 апреля 2011

... и способ изменить это использовать noskipws: f >> std::noskipws; не будет пропускать пробелы, пока вы не используете манипулятор std::skipws.

Но почему вы хотите прочитать '\n'? Чтобы убедиться, что есть один номер в строке? Это необходимо?

...