Ifstream Operator Überladung



  • Na also, was bringt das, da eine const-Variable als Parameter zu nehmen, wenn du doch eh eine nicht-const-Variable setzt? Fakt ist, dass du einen unsigned int an eine Funktion übergibst, die einen const unsigned int annimmt. Und diese Variable kannst du auch nicht const machen.



  • Aber dadurch stelle ich doch nur sicher das ich die übergebene Variable nicht ändere - was ich auch nicht tue. So hab ich das immer verstanden.

    Beim CopyKonstruktor übergibt man ja auch ein const Objekt.
    Set Vor- und Nachname übergebe ich auch ein const char.. und es funktioniert ja auch.

    Und mit Strings das klappt.
    Aber das muss als char sein... -.- !!



  • Die übergebene Variable wird kopiert, also ist es dem User völlig "wurscht", ob du die Kopie änderst oder nicht. const-Referenzen (das, was du bei Copy-Konstruktoren verwendest), sind was anderes. Da hier das Objekt nicht kopiert wird, ist es wichtig, ob du den Parameter änderst oder nicht.

    Versuch mal, die char* z.B per memset mit 0 zu initialisieren. Oder du schreibst einfach:
    char nachname[500] = {0};



  • Achso ok... aber zumindest funktioniert das aber... !

    Jedoch das einlesen immernoch nicht... man 😑 😡 😡



  • Hallo wieder 😉
    Also ich kann mir schon rein logisch keine Möglichkeit vorstellen, wie der istream per operator>>-Überladung in ein char-Array einlesen könnte. Der hat ja gar keine Ahnung, wieviel Speicher ihm dort zum Abspeichern zur Verfügung gestellt wird.

    Was du machen möchtest möchtest, bzw. aufgrund der Aufgabenstellung machen musst, ist folgendes:

    const unsigned int arrsize = 512;
    char inputArray[arrsize];
    unsigned int knr;
    
    ifs >> knr;
    k.setKnr( knr );
    
    ifs.getline( inputArray, arrsize );
    k.setNname( inputArray );
    
    ifs.getline( inputArray, arrsize );
    k.setVname( inputArray );
    

    Wie das jetzt mit den Newlines ist, müsste man gerade nochmal zusammenfriemeln (kenne dein Dateiformat jetzt nicht, man kann getline auch einen Trennbuchstaben ungleich '\n' mitgeben...), aber die grundsätzliche Vorgensweise wird erhalten bleiben.

    Viele Grüße,
    Deci



  • Also jetzt nur zum testen, in der Main Methode...

    So funktioniert es:

    //char name[30];
    
    	//ifstream ifs("kunde.txt");
    
    	////ifs.getline(name,29);
    	//ifs >> name;
    
    	//cout << name;
    	//cin.get();
    

    Das jetzt einfach in eine Funktion packen irgendwie und nicht nur name einlesen, sondern vorname, nachname und noch ein int.

    Und ich habe als Membervariablen nicht
    char name[xy];
    sondern
    char *name;
    also muss man noch irgendwie mit new alles neu anlegen usw.

    Aber ich kriege es nicht hin 😃 habe das vorhin noch geschafft, aber als Funktion nicht... 😑

    Wahnsinn... 😡



  • 1. Warum machst du nicht das, was Decimad dir gesagt hat?
    2. Du liest doch nicht in Membervariablen ein, sondern in lokale Variablen. Die darfst du auch als char-Array machen, da du in deiner Setter-Funktion ja sowieso den Inhalt kopierst.



  • Ich habe das schon gemacht, aber es hat nicht funktioniert.
    Habe ich wohl vergessen zu posten.



  • currency schrieb:

    Ich habe das schon gemacht, aber es hat nicht funktioniert.
    Habe ich wohl vergessen zu posten.

    Hast du auch Zeilenumbrüche in deine Datei gemacht?



  • Oh man, das natürlich nicht nicht und schau an...

    Meine Datei sieht so aus..

    165
    aba
    adgse

    Und er liest die Nummer und den Vornamen "aba" ein. Zum nachnamen kommt er aber nicht.
    Ich habe gedebuggt und habe gesehn, beim einlesen steht in beiden werten aba, also nicht nur in Vorname sondern auch in Nachname.

    Ich blick jetzt irgendwie überhaupt nicht mehr durch...



  • Dann zeig doch bitte mal deinen derzeitigen operator>>!



  • ifstream& operator>>(ifstream &ifs, Kunde &k)
    {
    	const unsigned int arrsize = 512;
    	char inputArray[arrsize];
    	unsigned int knr;
    
    	ifs >> knr;
    	k.setKnr( knr );
    
    	ifs.getline( inputArray, arrsize );
    	k.setNname( inputArray );
    
    	ifs.getline( inputArray, arrsize );
    	k.setVname( inputArray ); 
    
    	return ifs;
    }
    
    ofstream& operator<<(ofstream &of, const Kunde &k)
    {
    	if( k.getVname() != NULL && k.getNname() != NULL )
    	{
    		of << k.getKnr() << "   " << k.getVname() << "   " << k.getNname();
    		return of;
    	}
    	else
    	{
    		of << "Fehler";
    		return of;
    	}
    }
    


  • So, nun mal zur Ausbildung der Diagnosefertigkeiten. Das zweite getline... macht das gar nix oder liest es wirklich dasselbe wie das erste? (Tipp: Veränder mal das Array zwischendrin)

    Dann mal die Google-Suche!
    http://www.google.de/search?sclient=psy&hl=de&site=&source=hp&q=getline+problem&btnG=Suche

    Das führt zu:
    http://mathbits.com/mathbits/compsci/APstrings/APgetline.htm

    Beispielsweise ... Vielleicht hilft das, vielleicht nicht, ich habe den Fehler in deinem Quelltext nicht eingegrenzt.


Anmelden zum Antworten