我对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
}
count
和dirs
是一个全局变量,count
在另一个函数中增加,它是dirs
中值的计数。
我很抱歉,如果以前曾经问过,但我发现的解决方案对我来说不起作用。
例如ss.clear()
或while( ss >> f )
提前感谢您提供的任何帮助。
答案 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;
}