从Hex中的istream中读取一个double

时间:2016-05-26 13:16:53

标签: c++ hex scanf istringstream iomanip

给定double foo我可以使用sscanf从十六进制格式字符串中分配它,如下所示:

sscanf("0XD", "%lg", &foo)

但我似乎无法让istringstream以同样的方式行事。所有这些只是写0到foo

  1. istringstream("0XD") >> foo
  2. istringstream("0XD") >> hex >> foo
  3. istringstream("D") >> hex >> foo
  4. 当我在阅读here double istream提取运算符时应该:{/ p>

      

    检查在给定转换说明符的情况下char将解析的输入字段中是否允许从前面步骤获得的std::scanf

    为什么我不能从istream读取十六进制?我已经编写了一些测试代码here,如果它有助于测试。

2 个答案:

答案 0 :(得分:2)

您正在寻找的是hexfloat修饰符。 hex修饰符用于整数。

在合规编译器上,这将解决您的问题。

#include <cstdio>
#include <iomanip>
#include <iostream>
#include <sstream>
using namespace std;

int main() {
    double foo;

    sscanf("0xd", "%lg", &foo);
    cout << foo << endl;

    istringstream("0xd") >> hexfloat >> foo;
    cout << foo << endl;

    istringstream("d") >> hexfloat >> foo;
   cout << foo << endl; 
}

使用Visual Studio 2015会产生:

  

13
  13个
  13

使用libc++会产生:

  

13
  13个
  0

所以我不确定istringstream("d") >> hexfloat >> foo

的合法性

答案 1 :(得分:0)

例如,包括回送在内,这似乎可以在两个最新的编译器以及至少c ++ 17的环境下很好地工作:

MSVC 16.7.0 Preview 2 C ++ std / latest

Clang 10.0.0 -std = c ++ 2a

但是对于GCC失败,例如:

使用libstd ++的GCC 10.0.1 -std = c ++ 2a

该错误已暂停,等待C ++标准WG21做出决定

https://gcc.gnu.org/bugzilla//show_bug.cgi?id=81122

错误81122-[DR 2381]读取std :: hexfloat >> f时,解析f在“ 0”之后停止;

https://cplusplus.github.io/LWG/issue2381最后修改时间:2018-08-24

并且似乎由于不清楚的原因而停滞了:-(