给定double foo
我可以使用sscanf
从十六进制格式字符串中分配它,如下所示:
sscanf("0XD", "%lg", &foo)
但我似乎无法让istringstream
以同样的方式行事。所有这些只是写0到foo
:
答案 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
并且似乎由于不清楚的原因而停滞了:-(