Auslesen mit fstram
-
Hallo, ich habe ein Problem: ich möchte den >> operator zum file-einlesen überladen
eingelesen werden soll aus einer txt datei, undzwar eine undefinierte menge eines klassentyps Bank, jeder bank sind Konten (eigene klasse) zugeordnet die auf einem vektor gespeichert sind, jedes konto hat wiederum eine klasse person und jede person eine klasse datum.
Mein ansatz:
fstream &operator>>(fstream &FS, bank &b) //Eingabe b von FS { FS.open("temp.txt",ios::in); if(!FS.is_open()) {cout<<"Datei konnte nicht geöffnet werden!"<<endl;cin.get();return FS;} //überprüfen ob lesbar //temporäre daten zum zwischenspeicher -> zwischenlösung: char temp_n[80] , temp_v[80], dummy; double temp_b = 0.0; unsigned long temp_a = 0, temp_k = 0; int temp_d = 0, temp_m = 0, temp_y = 0; while(1) /* in c hätt ich bis EOF eingelesen, habe aber keine lösung für c++*/ { FS.getline(temp_n,80, '\n'); FS.getline(temp_v,80, '\n'); FS >> temp_d; FS.get(dummy); FS >> temp_m; FS.get(dummy); FS >> temp_y; FS.get(dummy); FS >> temp_k; FS.get(dummy); FS >> temp_b; FS.get(dummy); //nimmt '\n' auf Date dat(temp_d, temp_m, temp_y); //hier erstelle ich temporäre klassen -> sehe grade wäre oben sinnvoller person pers(temp_n,temp_v, dat); konto kont(pers, temp_k, temp_b); b += kont; //FS >> temp_n >> temp_v >> temp_d >> temp_m >> temp_y >> temp_k >> temp_b >> endl; } FS.close(); return FS;Ich hoffe das ich einigermaßen verstämdlich kommentiert habe.
mir geht es in erster lienie um die while schleife, die aus der txt datei einlesen, und es perr überladenem += operator an den bankvektor anhängtWeis jemand eine gescheite lösung?
Danke im voraus.
edit: in der textdatei sol es so stehen:
Name1
Vorname1
20 //tag
1 //monat
1980 //jahr
1 //kontonr
0.85 //kontobetrag
Name2
Vorname2
20
2
1980
2
0.00
/* .
.
.
.
usw */
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Also wenn du mit dem >> Operator arbeiten willst, übergibst du ja einen ostream. Musst daher also keinen mehr öffen (oder schliessen). Das wird ausserhalb gemacht.
fstream &operator>>(fstream &FS, bank &b) //Eingabe b von FS { FS >> b.name; FS >> b.vorname; FS >> b.tag; // usw. return FS; }Dafür muss die Funktion friend von b sein.
Danach musst du nur noch wissen, wie viele Personen du in der Datei hast und dann einfach schön nacheinander einlesen. (Das machst du aber nicht mehr in dieser Funktion, sondern in der main, oder sonst wo)
-
nein, das ist nicht sinn meiner aufgabenstellung.
der operator ist ohne friend umzusetzten.meine frage zielte ja auf meine schleife, ich würde sie gern umsetzten ohne das mir die anzahl der konten in der datei bekannt ist.
das problem ist ja eben, das die anzahl dynamisch ist.
-
schüler++ schrieb:
nein, das ist nicht sinn meiner aufgabenstellung.
der operator ist ohne friend umzusetzten.meine frage zielte ja auf meine schleife, ich würde sie gern umsetzten ohne das mir die anzahl der konten in der datei bekannt ist.
das problem ist ja eben, das die anzahl dynamisch ist.
Sorry, aber das ist so völliger Mist.

Wenn du unbedingt das so einlesen willst, dann nenn die Funktion irgendwie read_bank, oder so, aber mach da keinen Operator >>. Das entspricht nicht dem Sinn davon.
Wenn du einen dynamische Anzahl hast, dann speichere sie einfach als ersten in der Datei und dann lies die zuerst ein, dann weisst du wieviel es sein sollen.
-
ich glaube du verstehst mich nicht.(ich weis das das blöd ist,ist aber leider meine aufgabe - ansonsten wären auch andere alternativen denkbar)
und die daten sind bereits gegeben, da sie bereits in einer txt datei vorliegen, und mit dem überladenen operator eingelesen werden sollen (zu beginn meiner main)
die aufgabenstellung fand ich jetzt nur zu komplex um sie hier komplett reinzustellen.
ich setz mich ma nochma ran
edit:Hab jetzt ne lösung gefundenwhile(!FS.eof()) { FS >> temp_n; FS >> temp_v; FS >> temp_d;FS.get(dummy); FS >> temp_m;FS.get(dummy); FS >> temp_y;FS.get(dummy); FS >> temp_k;FS.get(dummy); FS >> temp_b;FS.get(dummy); //nimmt '\n' auf Date dat(temp_d, temp_m, temp_y); person pers(temp_n,temp_v, dat); konto kont(pers, temp_k, temp_b); b += kont; }muss nurnoch den << operator anpassen und dan funst es

und die öffnung von FS (siehe erster pst) ist doch eigentlich richtig, da ich dem f stream, der ja von iostream abgeleitet ist noch sagen muss ob lesen oder schreiben.
(sorry for missing context
)
-
schüler++ schrieb:
und die öffnung von FS (siehe erster pst) ist doch eigentlich richtig, da ich dem f stream, der ja von iostream abgeleitet ist noch sagen muss ob lesen oder schreiben.
(sorry for missing context
)Du misshandelst einfach den >> Operator.
Normalerweise erzeugst du einen Stream und benutzt dann die << >> Operatoren, um ein/auszulesen. Öffnen/Schliessen passiert ausserhalb.
Du kannst sowieso auch gleich einen ifstream benutzen, anstatt eines fstream's
http://www.cplusplus.com/reference/
-
drakon schrieb:
schüler++ schrieb:
und die öffnung von FS (siehe erster pst) ist doch eigentlich richtig, da ich dem f stream, der ja von iostream abgeleitet ist noch sagen muss ob lesen oder schreiben.
(sorry for missing context
)Du misshandelst einfach den >> Operator.
Normalerweise erzeugst du einen Stream und benutzt dann die << >> Operatoren, um ein/auszulesen. Öffnen/Schliessen passiert ausserhalb.
Du kannst sowieso auch gleich einen ifstream benutzen, anstatt eines fstream's
http://www.cplusplus.com/reference/ich sagte ja bereits: das ist vorgegeben. alle funtions und überladungsköpfe sollen so implementiert werden, wie sie gegeben sind(also in meiner aufgabe)
ich weis ich habe auch schon gelesen das man normalerweise den operator nicht für eine streamüberladung benutzt, aber was soll ich machen, is halt so gegeben, also suche ich eine lösung
