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ängt

    Weis 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 gefunden

    while(!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 🙂


Anmelden zum Antworten