C ++ istringstream в цикле не меняет своего значения - PullRequest
1 голос
/ 15 мая 2011

Я довольно новичок в c ++ и столкнулся с проблемой, когда одним поиском я не смог найти решение.

Проблема в том, почему istringstream никогда не меняет своего значения внутри цикла ниже?

Он берет значение из dirs [0] и dirs [1] и никогда не меняет их на возрастающее int i. Btw. значения в dirs [i] и dirs [i + 1] сохраняются как шестнадцатеричные значения (например, 0F9C8924).

Ниже приведены мои последние настройки, я пробовал несколько других способов, но безуспешно, например, наличие istringstream внутри цикла и ios_base :: trunc и тому подобное.

Также dirs[ i ] и т. Д. Имеют разные значения и правильно читаются, но при попытке преобразовать шестнадцатеричную строку в беззнаковое целое через istringstream он никогда не примет новые значения.

unsigned int f;
unsigned int t;
istringstream ss;
istringstream ss2;
for( int i = 0; i < count; i+=3 ) {
    ss.clear();
    ss2.clear();
    ss.str( dirs[ i ] );
    ss2.str( dirs[ i + 1 ] );

    ss >> f;
    ss2 >> t;



    // do something else with dirs[ i + 3 ], not relevant
}

count и dirs являются глобальной переменной, а count увеличивается в другой функции, а количество значений в dirs.

Извините, если раньше об этом спрашивали, но решения, которые я нашел, как-то не сработали для меня. Такие как ss.clear() или while( ss >> f )

Заранее благодарим за предоставленную помощь.

Ответы [ 3 ]

5 голосов
/ 15 мая 2011

Вопрос немного сбивает с толку. Вы имеете в виду, что ввод является строкой типа "0F9C8924"?

Если это так, попробуйте ss >> hex >> f;.

Вы должны написать некоторую обработку ошибок в своем коде, чтобы вы знали, когда и почему что-то идет не так. ss.clear() просто слепо очищает флаги ошибок, даже не выясняя, почему они были установлены.

0 голосов
/ 15 мая 2011

Это распечатывает десятичные значения шестнадцатеричных строк. Это то, что вы хотите?

#include <sstream>
#include <iostream>
using std::istringstream;
unsigned int f;
unsigned int t;
const char * dirs[12] = { 
    "0x15", "0x16", "dummy", 
    "0x11", "0x12", "dummy",
    "0x115", "0x116", "dummy",
    "0x111", "0x112", "dummy"
    };
unsigned int count = sizeof(dirs) / sizeof(const char *);
int main(int, char **) {
    for( unsigned int i = 0; i < count; i+=3 )
    {
        istringstream ss1( dirs[ i ] );
        istringstream ss2( dirs[ i + 1 ] );

        ss1 >> std::hex >> f;
        ss2 >> std::hex >> t;
        std::cout << "f is " << f << std::endl;
        std::cout << "t is " << t << std::endl;

        // do something else with dirs[ i + 2 ], not relevant
    }
    std::cin.get();
    return 0;
}
0 голосов
/ 15 мая 2011

Попробуйте:

unsigned int f;
unsigned int t;
for( int i = 0; i < count; i+=3 )
{
    istringstream ss1( dirs[ i ] );
    istringstream ss2( dirs[ i + 1 ] );

    ss1 >> f;
    ss2 >> t;

    // do something else with dirs[ i + 3 ], not relevant
}

Я полагаю, вы думали, что clear () очистит поток.И str () установит некоторый текст в поток.Вероятно, лучше всего объявить поток строк внутри цикла.Это означает, что они уничтожаются в конце цикла и воссоздаются при каждом входе в цикл.Тогда вы можете просто инициализировать их с помощью конструктора.

...