2

鉴于我可以使用这样double foo的十六进制格式字符串分配它:sscanf

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

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

  1. istringstream("0XD") >> foo
  2. istringstream("0XD") >> hex >> foo
  3. istringstream("D") >> hex >> foo

当我在这里读到double istream提取操作符应该:

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

为什么我不能从 中读取十六进制istream?如果对测试有帮助,我在这里写了一些测试代码。

4

2 回答 2

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

于 2016-05-26T14:42:05.287 回答
0

这(包括环回)似乎适用于两个最近的编译器和至少 c++17,例如:

MSVC 16.7.0 预览版 2 C++ 标准/最新

Clang 10.0.0 -std=c++2a

但 GCC 失败,例如:

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

此错误已暂停,等待 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

并且似乎由于不明原因而停滞不前:-(

于 2020-06-12T11:57:44.980 回答