Ifstream Operator Überladung
-
Hey Leute,
habe ein Kundenobjekt mit 2 Char arrays und einem int.
Soll den vornamen, nachnamen und die nummer aus einer Datei lesen und dazu den Operator >> überladen.Finde nichts passendes in google und komme auch nicht richtig weiter.
In der Kunde.h
friend ifstream& operator>>(ifstream &ifs, Kunde &k);
Die Membervariablen sind Private
In der Kunde.cpp
ifstream& operator>>(ifstream &ifs, Kunde &k)
{
char *vname = NULL;
char *nname = NULL;
unsigned int knr;ifs >> knr;
ifs >> vname;
ifs >> nname;
k.setKunde(vname,nname,knr);// ifs >> k.setKnr(??) >> k.setVname(??) >> k.setNname(??);
return ifs;
}Ich müsste ja beim einlesen am besten einen setter hernehmen... der setter macht automatisch auch ... = new char[strlen(x)] usw.
Aber was gebe ich da an.. also die Fragezeichen.Mein anderer Ansatz will auch nicht, also der nicht Kommentierte.
Hat jmd. vielleicht eine Idee etc. ?!

-
Sorry, hab vergessen den Code zu formatieren ^^
ifstream& operator>>(ifstream &ifs, Kunde &k) { char *vname = NULL; char *nname = NULL; unsigned int knr; ifs >> knr; ifs >> vname; ifs >> nname; k.setKunde(vname,nname,knr); // ifs >> k.setKnr(??) >> k.setVname(??) >> k.setNname(??); return ifs; }
-
Keiner eine Idee?
Meine ofstream Methode, also in eine Datei schreiben funktioniert...
ofstream& operator<<(ofstream &of, const Kunde &k) { of << k.getKnr() << " " << k.getVname() << " " << k.getNname(); return of; }
-
currency schrieb:
Keiner eine Idee?
Nicht so hastig.
Bevor ich jetzt viel Denkarbeit auf das Thema verschwende: Wie wäre es damit, std::string zu benutzen und so mit einem Schlag alle deine Probleme zu lösen? Falls dies nicht in Frage kommt, nenne bitte einen guten Grund dagegen.
-
Weil das eine Aufgabe ist und man die mit Char Arrays lösen muss.

-
Eine Schulhausaufgabe?

-
Vielleicht solltest du die char-Pointer auf etwas zeigen lassen bzw. gleich char-Arrays benutzen.
-
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
