2016-09-02 1 views
-3

in Datei gedruckt wird Ich habe eine C++ - Implementierung für einen Speziesbaum-Inferenzalgorithmus (https://bitbucket.org/ikramu/mixtreem/). Ich habe das Programm verwendet, um die Ergebnisse zu generieren (zuletzt November 2015). Kürzlich beschwerte sich ein Freund, dass das Programm kryptische hexadezimale Zeichen mit Baumspezies in die Datei schreibt. Wenn ich es überprüfte, stellt sich heraus, dass sowohl cout als auch ofstream beim Schreiben der Ausgabe in die Konsole/Datei Hexadezimalzeichen als Präfix verwenden.kryptisches hexadezimales Zeichen, das von C++ ofstream

Hier ist ein Beispiel Baum Zeichenfolge in falschem Format (((((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);

Hier ist ein Baum Zeichenfolge im richtigen Format (((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);

Wie ich von C/C++ für mehr als ein Jahr weg gewesen ist, ich don Ich weiß nicht, ob es an einigen Änderungen in der Plattform, der C++ - Version, der Architektur oder etwas anderem liegt. Der Code wurde seitdem nicht geändert (ich habe auch ältere Versionen des Codes kompiliert und getestet). Werde dankbar sein für irgendwelche Ideen/Hinweise?

UPDATE: Ich denke, es hat etwas damit zu tun, wie doppelte Werte (schlecht) gedruckt werden. Bitte sehen Sie sich die beigefügte Abbildung aus der Debugging-Sitzung an. Während der Wert Netbeans im Debugger -12315.334990286983 angezeigt wird, ist der gedruckte Wert (in Ausgabe im unteren Bereich) -0x1.80daae0f63389p + 13.

+3

Können Sie den Code auf ein kleines Beispiel reduzieren, um es hier zu posten? Siehe http://stackoverflow.com/help/mcve – Hayt

+0

@zaph Ich denke, die Code-Schrauben beim Drucken "Double/Float" -Werte. Siehe die Abbildung – Ikram

+0

Bitte löschen Sie den Kommentar, der der Frage hinzugefügt wurde. – zaph

Antwort

1

Ja, es sieht so aus, als wäre hexadezimal in den Ergebnissen, aber es sieht so aus, als wäre es ein Ausgabeformatierungsproblem in der sp_tree.output-Funktion. Fügen Sie den Code der Frage hinzu.

Beachten Sie, dass jeder Wert mit einem der folgenden Werte endet: p-1, p-2, p-3, p-4, p-5, p-6 und weder p noch - ist ein Hexadezimap-Zeichen. Die beste Option ist, dass das angegebene Format nicht die Datenwerte und Standardwerte für die Ausgabe, die Sie sehen, verändern kann.

Siehe C++ printf und Sie werden sehen, dass das Format, das Sie sehen, auf ein Formatierungszeichen zurückzuführen ist: 'a'.

Aus der Dokumentation:

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

zu Ihrem Ausgang vergleichen: 0x1.d517c27fc6fe9p-1

Vielleicht ist es ein dynamisches Format, das diese Ausgabe verursacht.

+0

Sie sind auf! Wenn ich printf() verwendet habe, druckt es den richtigen Wert für die Konsole aus. Ich versuchte mit std :: cout.precision (10) im Konstruktor in der Hoffnung, dass ich das richtige Format bekomme, aber es hat nicht funktioniert. Ich frage mich, ob ich C-basierte Dateioperationen verwenden muss, um die richtige Ausgabe in der Datei zu erhalten :-( – Ikram

Verwandte Themen