[c++] Ausgabe in Textdatei: Spaltenweise schreiben
-
Hallo Leute!
ich habe folgendes Problem und irgendwie ein Brett vorm Kopf. Eigentlich sollte das nicht so schwer lösbar sein. Ich möchte in folgendem Quelltext die sich ändernden Objektvalues Phenotyp(0) und Phenotyp(1) spaltenweise untereinander schreiben. Und zwar so:
P0 p0 p0
P1 p1 p1da eventuelle noch mehr Phenotypen hinzukommen werden, sollte das ganze in eine schleife gepackt werden.
std::ofstream outuebergabe(uebergabe, std::ios::out| std::ios::ate); int j=1; //Ind.-zähler int y= 2; // liefert ANzahl der Phenotypen zurück, probieren mit genom.nphenotype oder Anz_var benutzen aus VAriablen.dat!!! // dateierg und uebergabe fuellen mit Ergebnissen der Berechnung der Startpopulation, uebergabe wird dabei bei jeder neuen Generation wieder überschrieben for(int ii=0; ii<ga.population().size(); ii++){ genome = ga.population().individual(ii); //genome als Objektvar. für individum festlegen, dient zur Abkürzung des Ausdrucks outuebergabe << j << " x1 " << genome.phenotype(0) << "\n " << j << " x2 " << genome.phenotype(1); }Wie bekomme ich das hin?
Danke für eure Hilfe.
Grüße
Guddy
-
mit
"\t"in einem String kannst du Tabulatoren setzen. Vielleicht reicht dir das schon als "Tabelle"?
-
cout << width(x) << text << width(y) << text2 << endl;ist wesentlich besser als \t, da dir das schnell was zerhaut, wenn etwas zu lang ist. Und da die Länge eines Tabs nicht immer gleich ist bzw. dargestellt wird, ist es sowieso nicht zu empfehlen.
Du willst also die einzelnen Datensätze nebeneinander darstellen?
Da gibt es verschiedene Optionen.- du gehst über alle Datensätze und gibst von jedem den ersten Wert aus und wiederholst das komplett für alle Werte
- du gehst über alle Datensätze und speicherst die Ausgabe in einem Buffer für jeden Wert zwischen und gibst es am Ende aus.
- sonstige MethodenDie zweite ist mE am übersichtlichsten, da du auch nur eine Schleife hast.
-
hatte ich schon probiert:
outuebergabe << j << " x1 " << genome.phenotype(0) << "\n " << j << " x2 " << genome.phenotype(1) << "\t";die ausgabe ist dann:
p0
p1 p0
p1 p0
p1 p0was mach ich da falsch?
-
Das Ergebnis ist doch genau das, was du laut Quelltext haben willst.
Oder hast du \t und \n in der Ausgabe vertauscht?
-
jedes neue Wertepaar (p0 und p1) soll in eine neue Spalte geschrieben werden.
-
Fellhuhn schrieb:
Das Ergebnis ist doch genau das, was du laut Quelltext haben willst.
Oder hast du \t und \n in der Ausgabe vertauscht?
-
wie gesagt ich bekomme mit dem code das serviert:
p0
p1 p0
p1 p0
p1 p0
-
hmm beschreib bitte nochmal genau, wie du die Ausgabe haben willst.
-
Statt
outuebergabe << j << " x1 " << genome.phenotype(0) << "\n " << j << " x2 " << genome.phenotype(1) << "\t";dann
outuebergabe << j << " x1 " << genome.phenotype(0) << "\t " << j << " x2 " << genome.phenotype(1) << "\n";oder eben:
for(int idx = 0; idx < 2; ++idx) { outuebergabe << j << " x" << (idx+1) << " " << genome.phenotype(idx); if (idx != 1) { outuebergabe << "\t "; } } outuebergabe << "\n";
-
so wollte ich es eben nicht haben: sondern so:
beim ersten Durchlauf:
p0-1
p1-1beim zweiten durchlauf:
p0-1 p0-2
p0-1 p0-2beim dritten:
p0-1 p0-2 p0-3
p0-1 p0-2 p0-3usw.
-
Versteh ich nicht. Ich sehe da keinerlei Zusammenhang zwischen dem was zu schreibst und deinen Variablen.
-
@ fellhuhn: wieso? die Wertepaare sollen jeweils eine eigene Spalte(nicht Zeile) bekommen, die durch einen Tabulator getrennt sind. siehe letzten Beitrag von mir. Bei deinem beispiel wird es eben zeilenweise geschrieben und das möchte ich halt nicht!

-
In deinem Quellcode gibst du offensichtlich für jedes genompaar (nämlich in jedem Schleifendurchlauf) einen Zeilenumbruch aus. Da du aber nur einen einzigen Zeilenumbruch willst ist das offenbar falsch.
In C++ kann man leider nicht ohne weiteres eine spaltenweise Ausgabe machen, da man dazu immer wieder in die vorherige Zeile springen müsste. Das ist aber mit Standard C++ nicht machbar. (Es gibt aber irgendwelche Konsole-Frameworks die das vielleicht können)Die Lösung für Standard-C++ ist also, dir erst die Zeilen zusammenzubasteln und sie dann auszugeben, wenn du fertig bist. Ich würds in etwa wie folgt anstellen:
ostringstream zeile0("Phenotyp 0: "); ostringstream zeile1("Phenotyp 1: "); for(int ii=0, end=ga.population().size(); ii<end; ++ii) { genome = ga.population().individual(ii); zeile0 << width(10) << genome.phenotype(0); zeile1 << width(10) << genome.phenotype(1); } outuebergabe << zeile0.str() << '\n' << zeile1.str() << '\n' << std::flush;
-
Danke, das sollte gehen. Ich hab wohl etwas um die Ecke gedacht!
