代码之家  ›  专栏  ›  技术社区  ›  Jonathan Mee

从十六进制istream读取双精度

  •  3
  • Jonathan Mee  · 技术社区  · 9 年前

    鉴于 double foo 我可以使用 sscanf 这样地:

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

    但我似乎找不到 istringstream 以同样的方式行事。所有这些只是将0写入 foo :

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

    这在我阅读时尤其令人担忧 here 那个 double istream 提取操作员应:

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

    为什么我不能从 伊斯特拉姆 ? 我写了一些测试代码 here 如果它对测试有帮助的话。

    2 回复  |  直到 9 年前
        1
  •  2
  •   Jonathan Mee    9 年前

    你要找的是 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

        2
  •  0
  •   Paul A. Bristow    5 年前

    这包括环回似乎可以很好地与两个最新的编译器和至少c++17配合使用,例如:

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

    Clang 10.0.0-标准=c++2a

    但对于GCC则失败,例如:

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

    此错误暂停,等待C++标准WG21作出决定

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

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

    https://cplusplus.github.io/LWG/issue2381 上次修改日期:2018-08-24

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