Seite 1 von 1

Feste Breite für Floats mit iostreams

Verfasst: 30.09.2009, 12:34
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.

Re: Feste Breite für Floats mit iostreams

Verfasst: 30.09.2009, 14:39
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 ;)

Re: Feste Breite für Floats mit iostreams

Verfasst: 30.09.2009, 15:20
von Schrompf
Oder Du benutzt Boost.Format, dass die ganzen printf-Formatierer typsicher implementiert.