std :: stringstream十六进制转换错误

时间:2014-04-23 09:54:01

标签: c++ stl hex stringstream data-conversion

我尝试使用std::stringstream执行十六进制转换,如下所示:

std::stringstream s;
s << std::hex;

int i;

s << "100";
s >> i;     // 256

s << "10";  // doesn't work
s >> i;

但是评论指出,后来的转换失败了。我需要重置stringstream吗?为什么会失败?

2 个答案:

答案 0 :(得分:2)

您正在执行格式化输入,并在从字符串流中提取i之后设置了eofbit。因此,您必须清除状态或所有后续格式化的输入/输出将失败。

#include <sstream>
#include <iostream>

int main()
{
    std::stringstream s;
    s << std::hex;

    int i;

    s << "100";
    s >> i;     // 256
    std::cout << i << '\n';
    s.clear();  // clear the eofbit
    s << "10";  
    s >> i;     // 16
    std::cout << i << '\n';
    return 0;
}

答案 1 :(得分:0)

如果在s << "10"之后检查流状态,您将看到操作失败。我不确切知道原因,但您可以通过重置流来解决此问题:

#include <iostream>
#include <sstream>

int main()
{
  std::stringstream s;
  s << std::hex;

  int i;

  s << "100";
  s >> i;     // 256

  std::cout << i << '\n';

  s.str("");
  s.clear(); // might not be necessary if you check stream state above before and after extraction

  s << "10";  // doesn't work
  s >> i;

  std::cout << i << '\n';
}

Live demo here