由c ++ ofstream打印到文件的神秘十六进制字符

时间:2016-09-02 10:48:18

标签: c++ ubuntu gcc compilation hex

我有物种树推理算法(https://bitbucket.org/ikramu/mixtreem/)的C ++实现。我使用该程序生成结果(最后一次使用2015年11月)。最近,一位朋友抱怨该程序将带有物种树的神秘十六进制字符写入文件。当我检查时,结果是cout和ofstream两者在将输出写入控制台/文件时,前缀为十六进制字符。

以下是格式错误的示例树字符串 (((((gsLeaf_5_0:0x1.f48e471f06272p-3,gsLeaf_2_0:0x1.00dc26e053374p-1):0x1.323ffd29b8957p-1,gsLeaf_6_0:0x1.436dedaff881p-4):0x1.068e0e09d3ca6p-1,(gsLeaf_10_0:0x1.dddd5f73dc5a6p-1,(gsLeaf_0_0:0x1.7d04b4f035256p-4,(gsLeaf_9_0:0x1.c4789873fdf45p-1,gsLeaf_4_0:0x1.2821f2411930ap-6):0x1.9ac119403aff1p-5):0x1.60be9c70541f1p-4):0x1.44ea2f3a28908p-1):0x1.1e32eb27c05e3p-1,(gsLeaf_3_0:0x1.7a654ce448e53p-2,gsLeaf_8_0:0x1.78866bffd867ep-1):0x1.1835719e4a4fdp-3):0x1.5b907f43cbea7p-2,(gsLeaf_1_0:0x1.d517c27fc6fe9p-1,gsLeaf_7_0:0x1.ceaccb3d9531bp-1):0x1.2646ebc79ad1p-2,gsLeaf_11_0:0x1.0c5763dc4bda7p-1);

这是一个格式正确的树字符串 (((gsLeaf_10_0:0.627669,gsLeaf_5_0:0.510248):0.998783,(gsLeaf_2_0:0.862504,gsLeaf_9_0:0.929773):0.109781):0.265052,(((gsLeaf_7_0:0.245532,(gsLeaf_8_0:0.941468,gsLeaf_6_0:0.099485):0.061383):0.002515,gsLeaf_4_0:0.768784):0.417351,gsLeaf_11_0:0.182966):0.848415,((gsLeaf_3_0:0.460478,gsLeaf_0_0:0.082105):0.881017,gsLeaf_1_0:0.451832):0.938306);

由于我已经离开C / C ++超过一年,我不知道是否是由于平台,C ++版本,架构或其他方面的一些修改?从那以后代码没有改变(我编译并测试了旧版本的代码)。将不胜感激任何想法/提示?

更新: 我认为它与双重值(生病)打印的方式有关。请参阅调试会话中的附图。虽然Netbeans在调试器中显示的值是-12315.334990286983,但打印值(在底部的输出中)是-0x1.80daae0f63389p + 13。 enter image description here

1 个答案:

答案 0 :(得分:1)

是的,看起来结果中有十六进制,但看起来它是sp_tree.output函数中的输出格式问题。将该代码添加到问题中。

注意,每个值以下列之一结束:p-1,p-2,p-3,p-4,p-5,p-6,p或 - 都不是十六进制字符。最好的选择是指定的格式不能挂起数据值,默认为您看到的输出。

请参阅C++ printf,您会看到您看到的格式是由格式化字符引起的:'a'。

来自文档:

specifier Output                                 Example
a         Hexadecimal floating point, lowercase  0xc.90fep-2

与您的输出进行比较:0x1.d517c27fc6fe9p-1

可能存在导致此输出的动态格式。