由c ++ ofstream打印到文件的神秘十六进制字符
Posted
技术标签:
【中文标题】由c ++ ofstream打印到文件的神秘十六进制字符【英文标题】:cryptic hexadecimal character printed to file by c++ ofstream 【发布时间】:2016-09-02 10:48:17 【问题描述】:我有一个物种树推理算法的 C++ 实现 (https://bitbucket.org/ikramu/mixtreem/)。我使用该程序生成结果(上次使用时间为 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。
【问题讨论】:
你能把代码精简成一个小例子来贴在这里吗?见***.com/help/mcve @zaph 我认为代码在打印“double/float”值时会出现问题。见图 请删除添加到问题中的评论。 【参考方案1】:是的,结果中似乎有十六进制,但看起来这是 sp_tree.output 函数中的输出格式问题。将该代码添加到问题中。
请注意,每个值都以以下之一结尾:p-1、p-2、p-3、p-4、p-5、p-6,并且 p 或 - 都不是十六进制字符。最好的选择是指定格式不能挂起数据值,默认输出您所看到的。
查看C++ printf,您会看到您看到的格式是由于格式字符:'a'。
来自文档:
说明符输出示例 十六进制浮点数,小写 0xc.90fep-2比较你的输出:0x1.d517c27fc6fe9p-1
也许有一种动态格式导致了这个输出。
【讨论】:
你太棒了!当我使用 printf() 时,它会将正确的值打印到控制台。我在构造函数中尝试使用 std::cout.precision(10) 希望我可以获得正确的格式,但它没有奏效。我想知道我是否必须使用基于 C 的文件操作才能在文件中获得正确的输出:-(以上是关于由c ++ ofstream打印到文件的神秘十六进制字符的主要内容,如果未能解决你的问题,请参考以下文章