Datei einlesen und daten in variablen speichern
-
Hi
ich habe folgendes Problem (Borland C++ - Konsole):
Ich lasse mit meinem Programm verschiedene Zahlenwerte in eine Datei schreiben. Nun soll die Datei auch wieder eingelesen werden.
Meine Datei sieht so aus:"
// anzahl der kräfte und winkel //
4
// kräfte ; winkel //
12 ; 31
234 ; 123
123 ; 123
12 ; 34
// berechnete werte -- sin ; cos ; F * cos ; F * sin //
0.515038 ; 0.857167 ; 10.286 ; 6.18046
0.838671 ; -0.544639 ; -127.446 ; 196.249
0.838671 ; -0.544639 ; -66.9906 ; 103.156
0.559193 ; 0.829038 ; 9.94845 ; 6.71031
// Endlösungen -- resultierende Kraft F ; Winkel der resultierenden Kraft //
357.596 ; 3.39791e-39"
die 4 steht für eine anzahl und wird sozusagen für eine schleife benötigt
die anderen zahlen sollen in einem array dann landen, mit dem ich dann rechne.
ich komme aber zur zeit überhaupt nicht klar, wie ich die zahlen so einzeln einlese und zb einer float- oder integervariable zuweise. ich müßte ja immer bis zu einem semikolon parsen und was davor steht bzw danach zuweisen. die zeilen mit // sollen aber ausgelassen werden.vielleicht hat von euch jemand eine kleine idee, wie ich einen ansatz finde!
wäre echt dankbar!
mfg
robert
-
irgendwie mit fscanf, fgets und strtok wird das gehen
-
Das Vorgehen ist immer das gleiche: mache Dir ein paar Strukturen oder Klassen, in denen die eingelesenen Werte untergebracht werden. Diese sollten gleich so gestaltet werden, dass man nach dem Einlesen mit ihnen weiter arbeiten kann.
Dann wird jedem Typ ein Streaming-operator verpasst.#include <iostream> #include <fstream> #include <vector> #include <limits> std::istream& kommentar( std::istream& in ) { char c; in >> c; if( c != '/' ) // falls das nächste Zeochen '/' ist .. { return in.putback( c ); } // Rest der Zeile überlesen return in.ignore( std::numeric_limits< std::streamsize >::max(), '\n' ); }; struct Kraft { friend std::istream& operator>>( std::istream& in, Kraft& kraft ) { char semikolon; return in >> kraft.m_kraft >> semikolon >> kraft.m_winkel; } private: double m_kraft; double m_winkel; }; struct Kraft2 { friend std::istream& operator>>( std::istream& in, Kraft2& kraft ) { char semikolon; return in >> kraft.m_sin >> semikolon >> kraft.m_cos >> semikolon >> kraft.m_F_sin >> semikolon >> kraft.m_F_cos; } private: double m_sin, m_cos; double m_F_sin, m_F_cos; }; int main() { using namespace std; vector< Kraft > kraefte; vector< Kraft2 > kraefte2; Kraft resultierendeKraft; ifstream file( "input.txt" ); int n; Kraft kraft; file >> kommentar >> n >> kommentar; for( int i = 0; i < n && file >> kraft; ++i ) kraefte.push_back( kraft ); Kraft2 kraft2; file >> kommentar; for( int i = 0; i < n && file >> kraft2; ++i ) kraefte2.push_back( kraft2 ); file >> kommentar >> resultierendeKraft; return 0; }.. und was diese 'struct's noch für Methoden bekommen, hängt davon ab, was Du mit den eingelesenen Kräften vorhast.
Gruß
Werner
-
Das hilft mir auch gerade super weiter!
Was mache ich, wenn ich beispielsweise ein Array von 100 Elementen habe, die ich einlesen möchte.
Kann ich den Teil
return in >> Ziel1 >> Ziel2 >> ...auch durch ne Schleife ersetzen?
Falls ja? Erst mit ner Schleife alles einsammeln und dann "return" angeben?
Danke im Voraus.
Bin leider absolut Stream-Unwissend
-
JoKl schrieb:
Was mache ich, wenn ich beispielsweise ein Array von 100 Elementen habe, die ich einlesen möchte.
Kann ich den Teil
return in >> Ziel1 >> Ziel2 >> ...auch durch ne Schleife ersetzen?
Ja sicher: (wie oben schon beschrieben)
#include <iostream> #include <fstream> int main() { using namespace std; const int N = 100; int array[N]; ifstream file( "input.txt" ); for( int i = 0; i < N && file >> array[i]; ++i ) ; if( file ) { ; // array mit N Elementen ohne Fehler gelesen } return 0; }JoKl schrieb:
Falls ja? Erst mit ner Schleife alles einsammeln und dann "return" angeben?
ich versteh' die Frage nicht .. was meinst Du mit 'dann "return" angeben'?Gruß
Werner