TommoA Geschrieben 6. Juni 2005 Geschrieben 6. Juni 2005 Kann mir vieleicht einen Tipp geben, wie ich die Daten in eine Datei speicher und auslese? #include <string> #include <stdexcept> #include <iostream> #include <stdlib.h> #include <stdio.h> using namespace std; const int ANZ=1; // Klasse Adresse class Adresse { private: public: std::string name; std::string vorname; std::string strasse; int postleitzahl; std::string stadt; std::string get_name() {return name;} std::string get_vorname() {return vorname;} std::string get_strasse() {return strasse;} int get_postleitzahl() {return postleitzahl;} std::string get_stadt() {return stadt;} void set_name(std::string nam) {name=nam;} void set_vorname(std::string vor) {vorname=vor;} void set_strasse(std::string str) {strasse=str;} void set_postleitzahl(int plz) {postleitzahl=plz;} void set_stadt(std::string sta) {stadt=sta;} }; // Klasse GUI class GUI { int auswahl; public: GUI() {auswahl=7;} int menueauswahl(void) { cout << "1 - Daten Eingabe" <<endl; cout << "2 - Daten anzeigen" <<endl; cout <<"3 - Daten \x84ndern" <<endl; cout <<"4 - aus Datei anzeigen" <<endl; cout <<"5 - Daten l\x94schen" <<endl; cout <<"6 - in Datei speichern" <<endl; cout << endl; cout <<"7 - Programm beenden" <<endl; cout << endl; cout << "Eingabe=> "; cin>> auswahl; return auswahl; } int getAuswahl() { return auswahl; } //Eingabe void eingabe(Adresse adr[]) { int postleitzahl; for (int i=0;i<ANZ;i++) { if(adr[i].get_name()=="#") { system("CLS"); cout <<"Eingabefolge: Name Vorname Strasse Postleitzahl Stadt"<<endl; cout <<endl; cout <<"Geben Sie den Namen ein : "; std::string name; cin >> name; adr[i].set_name(name); cout <<"Geben Sie den Vornamen ein : "; std::string vorname; cin >> vorname; adr[i].set_vorname(vorname); cout <<"Geben Sie die Strasse ein : "; std::string strasse; //getline(cin,strasse,' '); cin >> strasse; adr[i].set_strasse(strasse); cout <<"Geben Sie die Postleitzahl ein : "; cin >> postleitzahl; adr[i].set_postleitzahl(postleitzahl); if(!cin.good()) { system("CLS"); cout<<"*** FEHLER ***"<<endl; throw invalid_argument("Sie haben keine Zahl eingeben!"); } cout <<"Geben Sie die Stadt ein : "; std::string stadt; cin >> stadt; adr[i].set_stadt(stadt); system("CLS"); cout <<"Soll eine weitere Adresse eingetragen werden?"<<endl; cout <<endl; cout <<"1 - Ja"<<endl; cout <<"2 - Nein"<<endl; cout <<endl; cout << "Eingabe=> "; int eingabe; cin >> eingabe; if(eingabe==1) { ; } else { i=ANZ; } } else{;} } system("CLS"); cout << "Daten vollst\x84ndig!!"<< endl; cout << endl; } //Ausgabe void ausgabe(Adresse adr[]) { system("CLS"); for (int i=0;i<ANZ;i++) { cout <<"Zeile "<<i<<": "; cout <<adr[i].get_name()<<" "; cout <<adr[i].get_vorname()<<" "; cout <<adr[i].get_strasse()<<" "; cout <<adr[i].get_postleitzahl()<<" "; cout <<adr[i].get_stadt()<<endl; } cout << endl; system("PAUSE"); system("CLS"); } //Bearbeitung void bearbeitung(Adresse adr[]) { GUI starteGUI; starteGUI.ausgabe(adr); cout << "Welche Zeile m\x94""chten Sie \x84ndern?"<<endl; cout <<endl; cout << "Eingabe=> "; int zeile; cin >> zeile; system("CLS"); cout<<"\x8enderung der Zeile "<<zeile<<endl; cout<<endl; cout <<"Geben Sie den Namen ein : "; std::string name; cin >> name; adr[zeile].set_name(name); cout <<"Geben Sie den Vornamen ein : "; std::string vorname; cin >> vorname; adr[zeile].set_vorname(vorname); cout <<"Geben Sie die Strasse ein : "; std::string strasse; cin >> strasse; adr[zeile].set_strasse(strasse); cout <<"Geben Sie die Postleitzahl ein : "; int postleitzahl; cin >> postleitzahl; adr[zeile].set_postleitzahl(postleitzahl); cout <<"Geben Sie die Stadt ein : "; std::string stadt; cin >> stadt; adr[zeile].set_stadt(stadt); system("CLS"); cout<<"Daten der Zeile "<<zeile<<" ge\x84ndert"<<endl; cout<<endl; } }; // Klasse DateiIO class DateiIO { public: DateiIO() { } void speichern(Adresse adr[]) {cout<<"speichern"<<endl; FILE *fp; fp=fopen("test.txt","w"); fwrite(adr,sizeof(Adresse),50,fp); fclose(fp); } }; // Klasse Steuer class Steuer { DateiIO dat; public: Steuer() { int auswahl; Adresse adr[ANZ]; GUI starteGUI; for (int i=0;i<ANZ;i++)//init Datensätze { adr[i].set_name("#");//datensatz frei adr[i].set_vorname("hier"); adr[i].set_strasse("ist"); adr[i].set_postleitzahl(0); adr[i].set_stadt("abgelegt!"); } int weiter=1; while(weiter) { switch(starteGUI.menueauswahl()) { case 1: starteGUI.eingabe(adr);break; case 2: starteGUI.ausgabe(adr);break; case 3: starteGUI.bearbeitung(adr);break; case 4: dat.laden(adr);break; case 5: break; case 6: dat.speichern(adr);break; case 7: system("CLS");weiter=0;break; default: system("CLS"); cout << "Machen Sie eine Eingabe zwischen 1 und 7!" << endl; cout << endl; }if(!cin.good()) { system("CLS"); cout<<"*** FEHLER***"<<endl; throw invalid_argument("Sie haben keine Zahl eingeben!"); } } } }; // Main Programm int main(int argc, char *argv[]) { try { Steuer start; } catch(invalid_argument ia) {cout << "Argumenterror: "<<ia.what()<<endl; } catch(exception &e ) { cout << "Exception"<<e.what()<<endl; } system("PAUSE"); return 0; } Zitieren
GrEnE Geschrieben 9. Juni 2005 Geschrieben 9. Juni 2005 Ja, einlesen == ifstream und schreiben == ofstream. (#include <fstream>) Benutzung; prinzipiell wie std::cout. Beispiel: Um später die Sachen leichter zu nutzen, überladest du erstmal den <<-operator. std::ostream& operator<<(std::ostream& os, const Adresse& addr) { os << addr.get_vorname() << '\t' << addr.get_name() << '\n'; // ... und so weiter, halt eine Format wählen, wie es ausgegeben werden soll } Benutzung: void speichern(const Adresse& addr) { std::ofstream ofs("test.txt"); ofs << addr; } Das Gute, du kannst diesen <<-operator auch für std::cout benutzen, um Ausgaben zu machen. std::cout << addr; Einlesen geht auf den gleichen Weg: Nutze 'std::ifstream'; kannst auch den >>-operator überladen. std::ifstream ifs("test.txt"); std::string value; ifs >> value; // gibt einen string, bis ' ' oder '\n' int number; ifs >> number; //gibt die eine zahl Mit 'std::getline' bekommst du eine eine Zeile! Damit solltest du erstmal weiter kommen, bei Fragen - einfach Fragen... Gruß GrEnE Zitieren
realisticer Geschrieben 9. Juni 2005 Geschrieben 9. Juni 2005 std::ostream& operator<<(std::ostream& os, const Adresse& addr) { os << addr.get_vorname() << '\t' << addr.get_name() << '\n'; // ... und so weiter, halt eine Format wählen, wie es ausgegeben werden soll } Wobei wir hier 'os' natuerlich auch am Ende wieder zurueckgeben, schliesslich wollen wir ja auch sowas wie cout<<addr1<<addr2<<addr3; schreiben koennen mfg realisticer Zitieren
GrEnE Geschrieben 9. Juni 2005 Geschrieben 9. Juni 2005 @realisticer Ja klar ist selbst verständlich. ;-) - Hätte ja der Compiler darauf aufmerksam gemacht, wegen fehlenden "return". Also richtig dann ... std::ostream& operator<<(std::ostream& os, const Adresse& addr) { os << addr.get_vorname() << '\t' << addr.get_name() << '\n'; // ... und so weiter, halt eine Format wählen, wie es ausgegeben werden soll return os; } Zitieren
TommoA Geschrieben 10. Juni 2005 Autor Geschrieben 10. Juni 2005 Vielen Dank, aber irgendwie bekomm ich das nicht hin. Ich denke, ich verstehe was das bewirken soll aber bekomm es einfach nicht hin. Zitieren
GrEnE Geschrieben 10. Juni 2005 Geschrieben 10. Juni 2005 Vielen Dank, aber irgendwie bekomm ich das nicht hin. Ich denke, ich verstehe was das bewirken soll aber bekomm es einfach nicht hin. Hmm, was ist denn das Problem? - Compiler-Fehler oder Konzept Probleme? std::ostream& operator<<(std::ostream& os, const Adresse& addr) { os << addr.get_vorname() << '\t' << addr.get_name() << '\t' << addr.get_strasse() << '\t' << addr.get_postleitzahl() << '\t' << addr.get_stadt() << '\n' return os; } Benutzung: // Klasse DateiIO class DateiIO { public: DateiIO() { } void speichern(const Adresse& adr) { std::ofstream ofs("test.txt"); ofs << addr; } }; So dies sollte eine Datei schreiben, wo alle Daten mit einen Tabulator getrennt sind. Beispiel: "Mark Mustemann Musterstraße 3 1234 Musterhausen" Und dieses Format kannst du wieder einlesen. Zitieren
TommoA Geschrieben 10. Juni 2005 Autor Geschrieben 10. Juni 2005 28: std::ostream& operator<<(std::ostream& os, const Adresse& addr) 29: { 30: os << addr.get_vorname() << '\t' 31: << addr.get_name() << '\t' 32: << addr.get_strasse() << '\t' 33: << addr.get_postleitzahl() << '\t' 34: << addr.get_stadt() << '\n' 35: return os; 36: } Ich bekomme Fehler gemeldet. 28: syntax error before `&' token 29: std::ostream& operator<<(...)' must have an argument of class or enumerated type 29: std::ostream& operator<<(...)' must take exactly two arguments In function `std::ostream& operator<<(...)': 30: os' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.) 30: addr' undeclared (first use this function) 35: syntax error before `return' [adressverwaltung.o] Error 1 Zitieren
GrEnE Geschrieben 15. Juni 2005 Geschrieben 15. Juni 2005 Hmm, 1. Welchen Compiler nutzt du? 2. Klasse 'Adresse' ist zum Zeitpunkt bekannt? Also 'Adresse' hast du vorher deklariert? <<-operator darf keine Elementfunktion sein! Aufbau ungefähr so ... class Adresse { ... }; std::ostream& operator<<(std::ostream& os, const Adresse& addr); Nebenbei, mach mal das 'using namespace std;' weg - dies macht man nicht! Davon abgesehen, dass du sowieso überall 'std::' davor geschrieben hast Gruß GrEnE PS: Hast du alles in einer Datei oder hast du was gesplittet? PPS: Sorry für späte Antwort, war nicht erreichbar.. Zitieren
carstenj Geschrieben 15. Juni 2005 Geschrieben 15. Juni 2005 Hi, Nebenbei, mach mal das 'using namespace std;' weg - dies macht man nicht! In Headerdatein nicht, und natürlich auch dann nicht, wenn man, wie du bereits angemerkt hast, vor jede Klasse std:: schreibt, aber generell ist das völlig ok. Oder hab ich dich falsch verstanden? Zitieren
GrEnE Geschrieben 16. Juni 2005 Geschrieben 16. Juni 2005 Hi, In Headerdatein nicht, und natürlich auch dann nicht, wenn man, wie du bereits angemerkt hast, vor jede Klasse std:: schreibt, aber generell ist das völlig ok. Oder hab ich dich falsch verstanden? Klar schadet es nichts in Source-Dateien, aber dies macht man generell nicht bzw. sieht man nicht gerne. Dann merkt man unter Umständen einige Sachen nicht, wenn man den namsepace std "öffentlich" macht. Und zu faul wird ja wohl keiner sein, da immer 'std::' davor zu schreiben, oder? Mir fallen auch gerade nicht wirklich die Argumente ein, warum nicht ist schon so lange her. Aber ich werde nochmal forschen... PS: Bei mir in der Firma wirst erschossen, wenn du dies hinschreibst. Zitieren
realisticer Geschrieben 16. Juni 2005 Geschrieben 16. Juni 2005 Klar schadet es nichts in Source-Dateien, aber dies macht man generell nicht bzw. sieht man nicht gerne. Es kommt, imho, auf den einzelnen Fall an. Hier zu pauschalisieren ist m. A. nach schwachfug. Dann merkt man unter Umständen einige Sachen nicht, wenn man den namsepace std "öffentlich" macht. Du meinst Namenskonflikte? Sicherlich merkst du die, denn der Compiler wird dich darauf aufmerksam machen. Und zu faul wird ja wohl keiner sein, da immer 'std::' davor zu schreiben, oder? Es ist fuer _mich_ definitiv nicht akzeptabel, sich damit staendig abzuquaelen. Es hilft mir auch nicht bei der Lesbarkeit. Mir fallen auch gerade nicht wirklich die Argumente ein, warum nicht ist schon so lange her. Aber ich werde nochmal forschen... Es gibt pro und contra Argumente fuer die using-Direktive als auch fuer die using-Deklaration. mfg realisticer Zitieren
TommoA Geschrieben 18. Juni 2005 Autor Geschrieben 18. Juni 2005 Vielen Dank für die Antworten. Hab leider zur Zeit keine Zeit das auszuprobieren. Zitieren
MrKrasserAlsDu Geschrieben 1. Juli 2005 Geschrieben 1. Juli 2005 mir hat dieser Thread schon ziemlich weitergeholfen, aber ich krieg das mit dem Lesen nicht hin Adresse knd[ANZ]; std::string name; std::string vorname; std::ifstream fin("kunden.txt"); for (int i=0;i<ANZ;i++) { getline (fin, name); getline (fin, vorname); knd[i].set_name(name); knd[i].set_vorname(vorname); } Zitieren
MrKrasserAlsDu Geschrieben 2. Juli 2005 Geschrieben 2. Juli 2005 Jetzt funktioniert das einlesen von name und vorname, aber ich bekomme bei der hausnummer und der plz eine fehlermeldung weil sie ja INT sind. gibt es da noch einen anderen befehl, statt getline? void laden_knd(Adresse knd[]) { for (int i=0;i<ANZ;i++)//init Datensätze { knd[i].set_name("#");//datensatz frei knd[i].set_vorname("#"); } std::string name; std::string vorname; std::string strasse; std::string hausnummer; std::string plz; std::string stadt; std::ifstream fin; fin.open("kunden.txt"); do{ for (int i=0;i<ANZ;i++) { if(!fin.eof()) { getline (fin, name, '\t'); getline (fin, vorname, '\t'); getline (fin, strasse, '\t'); getline (fin, hausnummer, '\t'); getline (fin, plz, '\t'); getline (fin, stadt, '\t'); knd[i].set_name(name); knd[i].set_vorname(vorname); knd[i].set_strasse(strasse); knd[i].set_hausnummer(hausnummer); knd[i].set_plz(plz); knd[i].set_stadt(stadt); } } }while(!fin.eof()); system("pause"); fin.close(); } Zitieren
MrKrasserAlsDu Geschrieben 3. Juli 2005 Geschrieben 3. Juli 2005 habs mit atoi geschafft *juchuu* void laden_knd(Adresse knd[]) { std::string name; std::string vorname; std::string strasse; std::string hausnummer_string; std::string plz_string; std::string stadt; std::ifstream fin; fin.open("kunden.txt"); if (!fin) { cout << "Kunden-daten aus kunden.txt NICHT geladen weil die Datei nicht vorhanden ist. Tragen sie erst Daten ein und speichern sie diese.\n"; } else { int x; do{ for (int i=0;i<ANZ;i++) { if(!fin.eof()) { //int hausnummer=0; // int plz=0; getline (fin, name, '\t'); getline (fin, vorname, '\t'); getline (fin, strasse, '\t'); getline (fin, hausnummer_string, '\t'); getline (fin, plz_string, '\t'); getline (fin, stadt, '\n'); int hausnummer = atoi(hausnummer_string.c_str()); int plz = atoi(plz_string.c_str()); knd[i].set_name(name); knd[i].set_name(name); knd[i].set_vorname(vorname); knd[i].set_strasse(strasse); knd[i].set_hausnummer(hausnummer); knd[i].set_plz(plz); knd[i].set_stadt(stadt); x=i; } } name='#'; //löschen der beiden nullen in plz und hausnummer knd[x].set_name(name); }while(!fin.eof()); fin.close(); cout << "Auftrags-daten aus auftrag.txt geladen" << endl; } } Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.