Feste Breite für Floats mit iostreams

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
dowhilefor
Moderator
Beiträge: 173
Registriert: 27.02.2009, 15:44
Alter Benutzername: 6SidedDice
Echter Name: Nico Probst
Wohnort: Bochum
Kontaktdaten:

Feste Breite für Floats mit iostreams

Beitrag von dowhilefor »

Hallo zusammen,

momentan ein kleines Problem ich möchte meine Matritzen über einen stream einfach ausgeben, damit das anständig aussieht würde ich gerne die einzelnen werte wirklich auf eine bestimmte Breite fest setzen.
Leider führen meine Versuche da nicht zu korrekten Ergebnissen:

Bisher bin ich bis hier hin gekommen

Code: Alles auswählen

		inline std::ostream& operator << (std::ostream& out, const Matrix& aMat )
		{

			out << std::fixed << std::showpos << std::setw(6) << std::setprecision (3) << std::setfill('0') <<
				aMat.M[0] << " " << aMat.M[4] << " " << aMat.M[8] << " " << aMat.M[12] << std::endl <<
				aMat.M[1] << " " << aMat.M[5] << " " << aMat.M[9] << " " << aMat.M[13] << std::endl <<
				aMat.M[2] << " " << aMat.M[6] << " " << aMat.M[10] << " " << aMat.M[14] << std::endl <<
				aMat.M[3] << " " << aMat.M[7] << " " << aMat.M[11] << " " << aMat.M[15] << std::endl;
			return out;
		}
Was als Ausgabe dann bspw

Code: Alles auswählen

+0.750 +0.000 +0.000 +0.000
+0.000 +1.000 +0.000 +0.000
+0.000 +0.000 +1.010 -9.091
+0.000 +0.000 -1.000 +10.000
Liefert, wie man sieht ist die 10.000 hinten zu breit. Im Grunde ist mir die Art der Lösung egal also ob abgeschnitten wird, oder mit Nullen aufgefüllt wird. Hauptsache Die Floats sind gleich breit.

Kennt jemand eine Lösung? Würde ungerne auf printf umsteigen, nur deswegen.
Mein Gehirn besteht nur noch aus einem hash-index, ich weiss was ich kenn aber kenn nicht was ich weiss
Benutzeravatar
Biolunar
Establishment
Beiträge: 154
Registriert: 27.06.2005, 17:42
Alter Benutzername: dLoB

Re: Feste Breite für Floats mit iostreams

Beitrag von Biolunar »

Bevor du an den Flags was änderst solltest du wissen, dass std::setw nur für das Nächste Objekt gilt. D.h. du musst vor jeder Insertion setw verwenden, damit alle die selbe Länge haben.

Um die selbe länge der floats zu erreichen würde ich einfach die Nullen direkt hinter dem Vorzeichen einfügen, also std::internal als Flag hinzufügen. Damit hättest du dann die Dezimaltrennzeichen alle an der selben stelle, allerdings sieht die Ausgabe meiner Meinung etwas gewöhnungsbedürftig aus. Wenn du stattdessen std::left nimmst, werden die Nullen als Nachkommastellen eingefügt. Musst halt damit und std::setprecision, sowie std::setw ein bisschen herumspielen um was Schönes zu zaubern ;)
Benutzeravatar
Schrompf
Moderator
Beiträge: 4996
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Feste Breite für Floats mit iostreams

Beitrag von Schrompf »

Oder Du benutzt Boost.Format, dass die ganzen printf-Formatierer typsicher implementiert.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten