Ifstream Operator Überladung
-
Ne keine Schulhausaufgabe... verstehe nicht wo das Problem ist...
Und wenn es einfach nur so wäre weil ich wissen will wie das geht oder kein Plan... das is die Frage und mehr nicht..
Naja.. habe es immer noch nicht hingekriegt... Liest aber auhc nicht mal mein INT ein.. komisch..
ifstream& operator>>(ifstream &ifs, Kunde &k) { char *vorname = new char[500]; char *nachname = new char[500]; unsigned int knr; ifs >> knr >> vorname >> nachname; k.setNname(nachname); k.setVname(vorname); 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; } }Das ist mein derzeitiger Code, wie gesagt.. Datei schreiben funktioniert.. lesen funktioniert überhaupt nicht.
-
Dein Int wird beim Kunden auch nie gesetzt...
-
Stimmt, flüchtigkeitsfehler...
Habe den Setter auch noch hinzugefügt, er setzt jetzt das Int, jedoch eine ganz andere sehr große Zahl und nicht die Zahl die in der Datei steht.
An den Settern liegts aber nicht, die funktionieren sicher...
-
Da müsste man jetzt eine Menge schauen:
Was gibst du ein?
Liegt noch etwas im Puffer, was bei formatierter Eingabe Probleme bereiten könnte?
-
Also danke erstmal für die Hilfe...
Ich bin Anfänger und weiß gerade gar nich was du meinst.
In der Datei steht das "123456789 vorname nachname"Hier ist mal mein Code.. meiste ist dafür eh irrelevant..
Aber alles funktioniert.. ist schon getestet, bis auf das einlesen eines Kunden aus einer Datei.****** KUNDE.H ******
class Kunde { private: unsigned int m_knr; char *m_nname; char *m_vname; public: Kunde(); Kunde(const Kunde &k); ~Kunde(); void setVname(const char *vname); void setNname(const char *nname); void setKnr(const unsigned int knr); char* getVname() const; char* getNname() const; int getKnr() const; void print(); void setKunde(const char *vname, const char *nname, const unsigned int knr); Kunde& operator=(const Kunde &k); friend ostream& operator<<(ostream &cout, const Kunde &k); friend ifstream& operator>>(ifstream &ifs, Kunde &k); friend ofstream& operator<<(ofstream &of, const Kunde &k); };****** KUNDE.CPP ******
Kunde::Kunde() { m_knr = 0; m_vname = NULL; m_nname = NULL; } Kunde::Kunde(const Kunde &k) { setVname(k.m_vname); setNname(k.m_nname); setKnr(k.m_knr); } Kunde::~Kunde() { m_knr = 0; delete [] m_vname; delete [] m_nname; m_vname = NULL; m_nname = NULL; } void Kunde::setVname(const char *vname) { if( m_vname != NULL ) { delete [] m_vname; } m_vname = new char[strlen(vname)+1]; strcpy(m_vname, vname); } void Kunde::setNname(const char *nname) { if( m_nname != NULL ) { delete [] m_nname; } m_nname = new char[strlen(nname)+1]; strcpy(m_nname,nname); } void Kunde::setKnr(const unsigned int knr) { m_knr = knr; } char* Kunde::getVname() const { return m_vname; } char* Kunde::getNname() const { return m_nname; } int Kunde::getKnr() const { return m_knr; } void Kunde::print() { if( m_knr != 0 && m_vname != NULL && m_nname != NULL ) { cout << "\n\nKnr: " << m_knr << "\nVname: " << m_vname << "\nNname: " << m_nname << endl; } else { cout << "Ungueltig" << endl; } } void Kunde::setKunde(const char *vname, const char *nname, const unsigned int knr) { setVname(vname); setNname(nname); setKnr(knr); } Kunde& Kunde::operator=(const Kunde &k) { if( this != &k ) { setKnr(k.m_knr); setVname(k.m_vname); setNname(k.m_nname); } return *this; } ostream& operator<<(ostream &cout, const Kunde &k) { if( k.getVname() != NULL || k.getNname() != NULL ) { cout << "\n\nKnr: " << k.getKnr() << "\nVname: " << k.getVname() << "\nNname: " << k.getNname() << endl; return cout; } cout << "Fehler"; return cout; } ifstream& operator>>(ifstream &ifs, Kunde &k) { char *vorname = new char[500]; char *nachname = new char[500]; unsigned int knr; ifs >> knr >> vorname >> nachname; k.setNname(nachname); k.setVname(vorname); k.setKnr(knr); 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; } }******** MAIN *********
int main() { Kunde *k = new Kunde(); //k->setKunde("vorname", "nachname", 123456789); ifstream ifs("kunde.txt"); ifs >> *k; cout << *k << endl; cin.get(); }
-
Versuchs mal mit Zeilenumbrüchen in der Datei statt Leerzeichen.
Warum nimmt setKnr einen const unsigned int an?
-
Ja weil die Kundennummer immer größer 0 sein soll und dort wird sie ja nicht verändert, also der Parameter wird nicht verändert also kann man den doch dann const setzten ?!
In der Datei steht z.b 111 drin gerade, aber bei der ausgabe steht dann
Knr: -858993460
Vname:
Nname:
-
Ja, aber dann musst du auch eine const-Variable übergeben und die Variable, die du übergibst, ist nicht const und kann auch nicht const sein, da sie vom ifstream verändert wird. Das bringt also überhaupt nichts.
Kannst du ausprobieren, ob es mit einem std::string statt des char* funktioniert?
-
Ok das mit dem String probiere ich schnell.
Aber die Variable, die ich bei setKnr übergebe, also die, die const ist wird doch nicht verändert ?
Die Membervariable kriegt den Wert von Ihr aber mehr doch auch nicht...?!
-
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
adgseUnd 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>>!