循环中的C ++ istringstream不改变它的值

时间:2011-05-15 15:50:56

标签: c++ loops clear istringstream

我对c ++很新,遇到了一个问题,单独搜索我找不到解决方案。

问题是,为什么istringstream永远不会在下面的循环中改变它的值?

它从dirs [0]和dirs [1]获取值,并且永远不会将它们更改为增加的int i。 顺便说一句。 dirs [i]和dirs [i + 1]中的值存储为十六进制值(例如0F9C8924)。

下面是我的最新设置,我已经尝试了其他几种方法,但没有成功,例如在循环内部使用istringstream,使用ios_base :: trunc,无论如何。

同样dirs[ i ]等DO具有不同的值并且被正确读取,但是当尝试通过istringstream将字符串hex变为unsigned int时,它永远不会获取新值。

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
}

countdirs是一个全局变量,count在另一个函数中增加,它是dirs中值的计数。

我很抱歉,如果以前曾经问过,但我发现的解决方案对我来说不起作用。 例如ss.clear()while( ss >> f )

提前感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:5)

这个问题有点令人困惑。你的意思是输入是一个像“0F9C8924”的字符串吗?

如果有,请尝试ss >> hex >> f;

您应该在代码中编写一些错误处理,以便了解出现问题的时间和原因。 ss.clear()只是盲目地清除错误标记,而没有找到它们首先被设置的原因。

答案 1 :(得分:0)

试试这个:

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(&lt; string&gt;)会将一些文本设置到流中。可能最好在循环内声明stringstream。这意味着它们在循环结束时被销毁,并在每次进入循环时重新创建。然后你可以用构造函数初始化它们。

答案 2 :(得分:0)

这将打印出十六进制字符串的十进制值。这是你想要的吗?

#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;
}