2D-Array in TXT schreiben
-
Du könntest den Schleifenkörper auch folgendermassen umbauen, um alle möglichen Arrayformen abzudecken:
// Iterator über alle inneren Vektoren (Zeilen) for( vector<vector<double> >::const_iterator outer = array.begin(); outer != array.end(); ++outer ) { // Iterator über alle Elemente eines inneren Vektors (Spalten) for( vector<double>::const_iterator inner = outer->begin(); it != outer->end(); ++inner ) { if( inner != outer->begin() ) { // ab 2. Element Trennzeichen ausgeben cout << ";"; } // Element ausgeben cout << *inner; } // neue Zeile cout << endl; }Wenn dein Array 10Kx10K Elemente haben kann solltest du es per const Referenz übergeben. Als Referenz, um unnötiges Kopieren zu vermeiden und const, da du während der Ausgabe nur lesend darauf zugreifst.
-
Ich habe ihn so verstanden, dass sein einziges Problem ist, dass er keine Konsolenausgabe will ... dann sollte man sie einfach weglassen.
-
FrEEzE2046 schrieb:
Ich habe ihn so verstanden, dass sein einziges Problem ist, dass er keine Konsolenausgabe will ... dann sollte man sie einfach weglassen.
Ja ich weiss, war zu faul fstream statt cout zu benutzen, waren mir dann doch zwei Zeilen Code zu viel.
-
ok, also mein code funktioniert nun auch wunderbar.
hat der code von DocShoe irgendwelche vorteile?
habe noch nicht für 10000 elemente getestet, aber hätte der evt. gewindigkeitsvorteile?
-
ootobbyoo schrieb:
ok, also mein code funktioniert nun auch wunderbar.
hat der code von DocShoe irgendwelche vorteile?
habe noch nicht für 10000 elemente getestet, aber hätte der evt. gewindigkeitsvorteile?
Der Code von DocShoe ist viel allgemeiner, ohne wesentliche Nachteile durch die Abstraktion zu haben. Er ermöglicht es nämlich auch "nicht-rechteckige" Arrays auszugeben, was ein durchaus nicht ungewöhnlicher Anwendungsfall ist. Noch allgemeiner wäre es natürlich ein Template anstatt einer spezialisierten Funktion für vector<double> zu nehmen, aber wir wollen mal nicht gleich übertreiben.
-
also, mein code sieht nun folgendermaßen aus:
// Schreibt M_2 in TXT: void M_2_to_csv(vector<vector<vector<double> > > array){ long zeilen, spalten; FILE *file; zeilen = array.size(); // Länge Zeilen spalten = array[0].size(); // Länge Spalten file = fopen("M_2.txt", "w"); for(int i = 0; i < zeilen -1 ; i++){ // "-1", da letzte Zeile abgespalten wird for(int h = 0; h < spalten; h++){ if(h < spalten - 1){fprintf( file, "%g#", array[i][h][1] );} } fprintf( file, "\n" ); } fclose(file); }das funktioniert auch wunderbar...
allerdings möchte ich nun, dass hinter den letzten wert in der zeile keine raute mehr geschrieben wird. wie ist das möglich?
-
Die letzte Ausgabe einfach außerhalb der Schleife machen.
-
das hatte ich auch schon versucht, aber dann schreibt er den letzten wert immer an die zweite stelle und allen anderen werte sind wieder weg...
-
ootobbyoo schrieb:
das hatte ich auch schon versucht, aber dann schreibt er den letzten wert immer an die zweite stelle und allen anderen werte sind wieder weg...
Was macht er?
-
also eigentlich sollte es in der txt z.B. so aussehen:
2#3#4#13#0#0#0
es sieht dann aber so aus:
2#0
-
hat niemand eine idee?
hier nochmal der ursprüngliche code:
// Schreibt M_2 in TXT: void M_2_to_csv(vector<vector<vector<double> > > array){ long zeilen, spalten; FILE *file; zeilen = array.size(); // Länge Zeilen spalten = array[0].size(); // Länge Spalten file = fopen("M_2.txt", "w"); for(int i = 0; i < zeilen -1 ; i++){ // "-1", da letzte Zeile abgespalten wird for(int h = 0; h < spalten; h++){ fprintf( file, "%g#", array[i][h][1] ); } fprintf( file, "\n" ); } fclose(file); }ich möchte nur, dass am eine der zeile keine raute steht. das kann eigentlich nicht so schwer sein...
-
Hallo,
for(int i = 0; i < zeilen -1 ; i++){ // "-1", da letzte Zeile abgespalten wird for(int h = 0; h < spalten - 1; h++){ fprintf( file, "%g#", array[i][h][1] ); } fprintf( file, "%g\n", array[zeilen - 2][spalten - 1][1] ); }Wie wärs damit?
-
Braunstein schrieb:
Hallo,
for(int i = 0; i < zeilen -1 ; i++){ // "-1", da letzte Zeile abgespalten wird for(int h = 0; h < spalten - 1; h++){ fprintf( file, "%g#", array[i][h][1] ); } fprintf( file, "%g\n", array[zeilen - 2][spalten - 1][1] ); }Wie wärs damit?
Wie wärs mit C++?
-
Warum sagst du mir das?
Der OP wollte printf und FILE verwenden, wer bin ich denn ihn daran zu hindern?
-
Du, bist, BRAUNSTEIN! Aber leider nicht Sparta, sonst hättest du ihn davon überzeugt, dass fprintf und FILE der absolut falsche Ansatz in C++ sind.
-
ok, danke erstmal.
wieso der falsche ansatz? wie mache ich es denn besser?
so, wie ich es geschrieben habe, läuft es sehr gut und auch schnell...
-
Richtig wäre es die Streams zu benutzen. Sonst kannst du gleich C schreiben.
-
ok, aber welchen vorteil bringt mir das?
-
Typsicherheit und Austauschbarkeit. Ein fprintf mit einem Parameter, der nicht zum Format Identifier passt kann gerne schon mal für Unruhe sorgen.
Wenn du einen iostream operator für deinen Datentyp implementierst kann der Datentyp seinen Inhalt in jeden Stream schreiben und jeden Stream lesen, der das istream/ostream Interface unterstützt.