Datei einlesen und ausgeben
-
Als ich mich fürs programmieren entschied, wollte ich auch erst mal C lernen, auch mit Hilfe von Online-Tutorials.
Fand ich auch net so der Renner, bin dann eh auf C++ umgestiegen und habe die beiden Bücher, C++ in 21 Tage und den C++ Primer.
Wird echt alles eigentlich beschrieben, und mann hat auch immer was zum nachschlagen und suchen;-)Gruß freeG
-
erst einmal danke für die Hilfe.
Vielleicht habe ich mich etwas unklar ausgedrückt (sry dafür).
Ich will halt in eine Datei schreiben und aus einer Datei die Werte auslesen und in ein Array speichern.
"Vorlageformat" sieht halt so aus: 123.21;234.08;235.87;...;543.97
Und ich möchte halt, wenn ich diese einlesen wie folgt haben:
array[1] = 123.21
array[2] = 234.08
...
Genau so will ich dieses Array dann abspeichern, also vom "array" nach "123.21;234.08;235.87;...;543.97" in der Datei.
Danke.
-
ah ok... also was nettes jetzt gefunden
Das schreiben in eine Datei müsste dann so aussehen:
#include <iostream> #include <fstream> using namespace std; int main () { ofstream myfile ("example.txt"); if (myfile.is_open()) { for (i=0; i=x; i++ { if(i!=x) { myfile array[i] << ";"; // = array[1] = 123.21; array[2] = 234.08 ... array[x] = 543.97 } else { myfile array[i]; } } myfile.close(); } else cout << "Unable to open file"; return 0; }
dann wäre der Inhalt: 123.21;234.08;235.87;...;543.97.
Und genauso müsste ich dann das Einlesen machen:
#include <iostream> #include <fstream> #include <string> using namespace std; int main () { string line; ifstream myfile ("example.txt"); if (myfile.is_open()) { while (! myfile.eof() ) { getline (myfile,array); // wäre dann die EINE Zeile: 123.21;234.08;235.87;...;543.97 } myfile.close(); } else cout << "Unable to open file"; return 0; }
nur, wie bekomme ich dann diesen String in ein Array?!... Muss ich das mit "strtok" machen? Nur wie?
-
Ich würde das eher so schreiben:
#include <fstream> #include <vector> using namespace std; int main() { vector<double> Zahlen; double tmp; ifstream file("Beispiel.txt"); while (!file.eof()) { file >> tmp >> ';'; Zahlen.push_back(tmp); } }
-
ok... also heißt das jetzt so viel:
1. Vector = Dyn. Array?
file >> tmp >> ';';
löscht mir das ; von der dementsprechende Zahl und speichert diese in tmp?
Zahlen.push_back(tmp);
schreibt tmp in das dynamische Array wobei der index immer um 1 erhöht wird?
vielen Dank!
-
B1ND3R schrieb:
ok... also heißt das jetzt so viel:
1. Vector = Dyn. Array?
file >> tmp >> ';';
löscht mir das ; von der dementsprechende Zahl und speichert diese in tmp?
Zahlen.push_back(tmp);
schreibt tmp in das dynamische Array wobei der index immer um 1 erhöht wird?
vielen Dank!
1. Korrekt, man kann auch beim Konstruktor die Größe angeben: vector<double> Zahlen(100);
2. Liest eine Zahl in tmp und dann ein Semikolon. Das Semikolon wird in keine Variable geschrieben.
3. Vergrößert das Array um 1 und schreibt dann tmp ans Ende.
-
Super dank dir! GLeich mal ausprobieren
-
also habe jetzt mal den Kram implementiert. Bei der einlese-Funktion kommt folgender Fehler:
http://www.imagebanana.com/img/6uctkmwn/thumb/Unbenannt.JPGsowie beim close: "statement kann die Adresse der überladenen Funktion nicht ausführen".
Habe folgendes insg. included:
- iostream
- fstream
- vector
- stdio
- stringund dazu halt namespace std.
Nur wenn ich diesen namespace std. wieder lösche bekomme ich einen fehler bei "ifstream quelle" und zwar: "ifstream wurde in diesem Gültigkeitsbereich nicht definiert" und "expected ';' before quelle" und dann bekomme ich noch einen fehler bei "quelle.open(datei) und zwar: "quelle wurde in diesem Gültigkeitsbereich nicht definiert"
nochmals danke für die hilfe
-
cin >> tmp >> ':';
Das
>> ':'
ist Quatsch. Was soll das machen? Ich kann dir nicht einmal sagen, was richtig wäre, weil ich nicht begreife, warum du das dort überhaupt hingeschrieben hast.
-
Oh, Sorry, ich dachte, das ginge so wie bei scanf:
fscanf(datei, "%f;", Zahl);
Dann würde ich es so schreiben: (diesmal auch getestet)
#include <fstream> #include <vector> #include <iostream> #include <cstdio> using namespace std; int main() { vector<double> Zahlen; double tmp; char ch; ifstream file("Beispiel.txt"); while (!file.eof()) { file >> tmp >> ch; if(ch != ';') cout << "Fehlerhaftes Dateiformat"; Zahlen.push_back(tmp); } }
-
ja das hilft danke
eine Frage habe ich noch. Und zwar, habe ich ja eine Schleife, wo ich 21 Datein in ein großes Array speichern will - Problem ist nur er ließt immer die gleiche Datei ein, obwohl ich den Dateinname dementsprechend ändere.
Muss ich eine Datei auch wieder schließen wenn ich diese geöffnet habe - logischerweise ja, nur wenn ich das mache, siehe Bild: http://www.imagebanana.com/view/6uctkmwn/Unbenannt.JPG
dann bekomme ich ein: "statement kann die Adresse der überlaufenden Funktion nicht auflösen".
kann mir einer noch helfen bei dem "letzten" Prob
-
Du hast bei close die () vergessen.
Was heißt dementsprechend ändern? Rufst du immer die open()-Methode der Datei auf mit dem neuen Dateinamen?
-
Ja ich rufe in der schleife die open funktion immer wieder auf, nur mit anderen Dateinamen.
So fehler gefunden. Lag daran, dass ich vergessen habe, dass "push_back" bis ins "unendliche" zählt, ich aber immer wieder nur auf den anfang zugegriffen habe.
Also vielen Dank, allen die mir geholfen haben