benutzerliste



  • Hallo liebe forumsgemeinde

    Folgendes, ich solle von der schule her eine benutzerliste programmieren. Diese sollte wie folgt funktionieren:
    Der user kann einen neuen nutzer anlegen, dieser nutzer wird in eine datei geschrieben, der user kann die ganze datei und deren einträge anzeigen, dass ist die zweite funktion, zu guter letzt soll der user auch suchen können, dies ist die dritte funktion. Momentan sitze ich an der dritten funktion.
    Ich habe es geschaft, dass der user eine meldung erhällt, ob der name gefunden wurde. Mein problem ist folgendes:
    Ich möchte gerne den ganzen datensatz der person angezeigt bekommen, weiss gar nicht ob das in c++ geht.
    Unten der code, die fehleingaben wurden nicht abgefangen, müsst euch also nicht wundern:

    /*
     * verwaltung.cpp
     *
     *  Created on: 15.03.2013
     *      Author: xxx
     */
    
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <time.h>
    #include <string.h>
    
    using namespace std;
    void userEingaben();
    void userAnzeigen();
    void userSuchen();
    int main()
    {
    short auswahl;
    cout<<"wilkommen zur Adressverwaltung"<<endl;
    cout<<"Folgende Möglichkeiten stehen zu verfügung:"<<endl;
    cout<<"mit der 1 erstellen sie einen neuen eintrag"<<endl;
    cout<<"mit der 2 zeigen sie die vorhandenen einträge an"<<endl;
    cout<<"mit der 3 suchen sie die datei nach einemEintrag ab"<<endl;
    cout<<"Geben Sie bitte die nötige Zahl ein:"<<endl;
    cin>>auswahl;
    
    switch (auswahl)
    {
    case 1: userEingaben();
    break;
    case 2: userAnzeigen();
    bre[code="cpp"]ak;
    case 3: userSuchen();
    break;
    }
    }
    
    void userEingaben()
    {
    time_t t;
    time(&t);
    srand((unsigned int)t);
    
    struct adresse
    {
    	char vorname[50], nachname[50], mail[50], tN[50];
    	           int kundenNummer;
    		};
    	struct adresse mAdresse;
    	mAdresse.kundenNummer=rand();
    	cout<<"Folgend deine Kundennummer"<<mAdresse.kundenNummer <<endl;
    	cout<<"Gebe bitte deinen Vornamen ein:"<<endl;
    	cin>>mAdresse.vorname;
    	cout<<"Gebe bitte deinen Nachnamen ein:"<<endl;
    	cin>>mAdresse.nachname;
    	cout<<"Gebe bitte deine Mail ein:"<<endl;
    cin>>mAdresse.mail;
    cout<<"Gebe bitte deine Telefonnummer ein:"<<endl;
    cin>>mAdresse.tN;
    fstream datei ("C:/Dokumente und Einstellungen/msherif/Eigene Dateien/adressliste.txt", ios::out | ios::app);
    datei<<mAdresse.kundenNummer <<endl;
    datei<<mAdresse.vorname <<endl;;
    datei<<mAdresse.nachname <<endl;
    datei<<mAdresse.mail <<endl;
    datei<<mAdresse.tN <<endl;
    if(datei.good())
    {
    	cout<<"Ihre Einträge wurden gespeichert"<<endl;
    }
    else
    {
    cout<<"Ihre Einträge konnten leider nicht gespeichert werden"<<endl;
    }
    datei.close();
    cout<<"Möchten Sie einen weiteren Nutzer anlegen, drücke die 1, für das Hauptmenü die 2"<<endl;
    short auswahl;
    cin>>auswahl;
    switch (auswahl)
    {
    case 1: userEingaben();
    break;
    case 2: main();
    break;
    }
    }
    
    void userAnzeigen()
    {
    	fstream datei ("C:/Dokumente und Einstellungen/Eigene Dateien/adressliste.txt", ios::in);
    	char zeile[200];
    	while(datei.getline(zeile,200))
    	{
    		cout<<zeile<<endl;
    	}
    }
    
    void userSuchen()
    {
    	fstream datei ("C:/Dokumente und Einstellungen/Eigene Dateien/adressliste.txt", ios::in);
    cout<<"Gebe irgendeinen vor oder Nachnamen ein"<<endl;
    string suche;
    cin>>suche;
    bool gefunden =false;
    
    while(!datei.eof())
    {
    	string text;
    	getline(datei,text);
    	if(suche==text)
    	{
    		cout<<text<<endl;
    		gefunden=true;
    	}
    
    }
    if(gefunden ==true)
    {
    	cout<<"Es wurde eine Person mit dem Namen:"<<suche<<""<<"gefunden"<<endl;
    }
    else
    {
    	cout<<"Es wurde leider niemand gefunden"<<endl;
    }
    short auswahl;
    cout<<"Um nach einer anderen Person zu suchen, betätigen sie die 1:"<<endl;
    cin>>auswahl;
    userSuchen();
    
    }
    

    ich hoffe es ist nicht so furchtbar 😃



  • Selbstverständlich kann man mit C++ einen ganzen Datensatz anzeigen. Du musst wie beim Schreiben mehrere Variablen definieren, jeweils einen Datensatz in die Variablen einlesen und dann diese Variablen mit dem Suchstring vergleichen. Bei einem Treffer gibst du diese Variablen aus



  • hmm, sorry, aber ich habe dein vorhaben nicht so ganz verstanden.
    in der dritten funktion kann ja der user einen nach oder vornamen eingeben, dann will ich eigentlich gerne, dass er mir den datensatz des registrierten anzeigt, sprich mail, tel name vorname..



  • Moin coleman!
    Eigentlich ist es ganz einfach.
    Du baust Dir eine ordentliche Klasse für Kunden. Beispiel:

    #include <string>
    
    struct kunde{
      int kn;
      std::string vorname;
      std::string nachname;
    };
    

    Danach legst Du fest, wie Kunden in einer Datei abgespeichert werden. Ich entscheide mich mal für

    • pro Kunde eine Zeile
    • Felder durch Tabulator ('\t') getrennt

    .
    Dann schreibst Du einen Ausgabeoperator:

    #include <iostream>
    
    std::ostream& operator<<(std::ostream& out, const kunde& k){
      out << k.kn << '\t' << k.vorname << '\t' << k.nachname << '\n';
      return out;
    }
    

    Jetzt kannst Du schon Kunden wegspeichern ohne Ende.

    Das lesen ergibt sich zwangsläufig aus dem Format:

    #include <iostream>
    
    std::istream& operator>>(std::istream& in, kunde& k){
      kunde tmp;
      in>>tmp.kn;
      in.get(); // '\t' konsumieren.
      std::getline(in, tmp.vorname, '\t');
      std::getline(in, tmp.nachname, '\n');
      if(in.good())
        k=tmp;
      return in;
    }
    

    Ist das geschafft kannst Du Kunden lesen und schreiben:

    std::fstream out("test.dat");
    kunde k = //...
    out << k;
    
    std::ifstream in("test.dat");
    kunde k2;
    in >> k2;
    

    Das suchen würde dann vielleicht wie folgt realisiert. Du schreibst Dir eine Funktion, die einen Kunden und Dein Suchkriterium entgegennimmt und überprüft:

    bool ist_vorname(const kunde& k, const std::string& vorname){
      return k.vorname == vorname;
    }
    

    Damit hast Du eigentlich alles: Du liest alle Kunden ein, und prüfst jeden mit Deiner Funktion:

    std::ifstream in("test.dat");
    
    for( kunde tmp; in>>tmp; )  // Trick 17, aber akzeptierter Standard... :)
      if(is_vorname(tmp, "Furble"))
        std::cout << tmp;
    

    Das ist alles sehr rudimentär, aber die wichtigsten Punkte sind:
    Klasse für Deine Daten bauen und E/A-operationen definieren.

    Viel Erfolg.



  • coleman schrieb:

    ich hoffe es ist nicht so furchtbar 😃

    Doch, ist es.
    Du hast den Überblick über deine eigene Datenstruktur verloren bzw. nie gehabt.
    Das ist aber für einen Anfänger normal.

    Du schreibst jedes Element jedes Datensatzes in eine Zeile:

    datei<<mAdresse.kundenNummer <<endl;
    datei<<mAdresse.vorname <<endl;;
    datei<<mAdresse.nachname <<endl;
    datei<<mAdresse.mail <<endl;
    datei<<mAdresse.tN <<endl;
    

    und liest dann zeilenweise:

    while(!datei.eof())
    {
    string text;
    getline(datei,text);
    if(suche==text)
    {
    cout<<text<<endl;
    gefunden=true;
    }
    

    d.h. du liest elementweise (weil du zeilenweise liest) und wunderst dich dann, dass du nur ein Element in der Hand hast und nicht alle Elemente des Datensatzes.
    Und das ist dein Problem.

    Es gibt mehrere Ansätze für dein Problem, du könntest z.B. wie oben erwähnt alle 5 Elemente in eine Zeile schreiben und musst dann natürlich beim Lesen auch Variablen für alle 5 Elemente gleichzeitig vorhalten;
    oder du lässt das Schreiben so wie es ist und baust das Lesen um:

    ifstream f("C:/Dokumente und Einstellungen/msherif/Eigene Dateien/adressliste.txt");
    // erstmal alle Elemente als String lesen, die Frickelei in die einzelnen Typen kannst du später noch machen
    // außerdem kapselst du somit die Datei-Lese-Funktionalität von der fachlichen Interpretation des gelesenen Daten
    for( string kundenNummer
                vorname,
                nachname,
                mail,
                tN; f>>kundenNummer&&f>>vorname&&f>>nachname&&f>>mail&&f>>tN; )
    {
      // hier kommst du nur hin, wenn 5 durch Whitespaces getrennte Strings fehlerfrei gelesen werden konnten
      if( suche==nachname )
        cout << kundenNummer << vorname << nachname << mail << tN << endl;
    }
    


  • for( string kundenNummer
                vorname,
                nachname,
                mail,
                tN; f>>kundenNummer&&f>>vorname&&f>>nachname&&f>>mail&&f>>tN; )
    {
    

    löl



  • Das hat man dann davon, wenn man den Leuten "so lokal wie möglich!!11!" in die Köpfe hämmert. 😃


Log in to reply