"telefonbuch"



  • Hallo,
    ich will sone art telefonbuch programmieren aber ich weiß nicht wie ich einträge in einer datei abspeichern soll:(
    und dann auch wieder abrufen,
    könnt ihr mir helfen??
    danke:)



  • Hallo,
    weißt du du denn, wie du grundsätzlich aus Dateien liest bzw. in Dateien schreibst?

    Wenn ja, dann sollte es kein so großes Problem darstellen, Einträge zu lesen bzw. zu schreiben.
    Wenn Beispielsweise ein Eintrag des Telefonbuches so aussieht:

    struct entry
    {
          std::string name; // der Name;
          std::string number; // die Tel-Nr.
    };
    

    Dann würde ich Zeilenweise in die Datei schreiben bzw. aus ihr lesen. D.h. das in jeder 2*n. Zeile der Name steht und in jeder 2*n+1. Zeile die dazugehörige Nummer.

    /edit: Wenn du dagegen nicht weißt wie du aus Dateien liest bzw. in selbige schreibst, dann siehe C++-FAQ und eventuell in Volkards C++ Tutorial (Dort schreibst du dein eigenes Telefonbuch).

    Caipi



  • Bei der Telefonbuchgeschichte drängt sich förmlich ne std::map auf.
    Wobei die map Lösung erstmal voraussetzt dass keine doppelten Namen vorkommen.
    Der Fall dass mehrere "Abfrageergebnisse" existieren können müsste aber auch bei jeder anderen Lösung abgefangen werden,und dass unter einem Mehraufwand den ich nicht bereit bin zu investieren 😃 😉
    Nen minimales Telefonbuch(das "nur" die Kernfunktionalität liefert)könnte etwa so aussehen.

    Telefonbuch.h

    #ifndef __TELEFON_BUCH_H
    #define __TELEFON_BUCH_H
    
    #include <iostream>
    #include <map>
    #include <string>
    
    class telefonbuch
    {
    public:
    	void neuerEintrag(const std::string& name,const std::string& num);
    	std::string findeNummer(const std::string& name)const;
    	void speichern(const std::string& filename)const;
    	void laden(const std::string& filename);
    private:
    	std::map<std::string,std::string > b;
    };
    
    #endif
    

    Telefonbuch.cpp

    #include "telefonbuch.h"
    #include <utility>
    #include <fstream>
    
    void telefonbuch::neuerEintrag(const std::string& name,const std::string& num)
    {
    	b.insert(make_pair(name,num));
    }
    
    std::string telefonbuch::findeNummer(const std::string& name)const
    {
    	std::map<std::string, std::string >::const_iterator it=b.find(name);
    	return it==b.end() ?"Kein Eintrag!":(*it).second;
    }
    
    void telefonbuch::speichern(const std::string& filename)const
    {
    	std::ofstream of(filename.c_str());
    	if(of)
    	{
    		std::map<std::string, std::string >::const_iterator it= b.begin();
    		while(it!=b.end())
    		{
    				of<<(*it).first<<'\n';
    				of<<(*it).second<<'\n';
    				++it;
    		}
    		of.close();
    	}
    	else
    		std::cout<<"Fehler beim öffnen der Datei!"<<std::endl;
    }
    
    void telefonbuch::laden(const std::string& filename)
    {
    	std::ifstream in(filename.c_str());
    	while(in)
    	{
    		std::string name;
    		std::string num;
    		getline(in,name);
    		getline(in,num);
    		neuerEintrag(name,num);
    	}
    	in.close();
    }
    

    MfG Spacelord



  • hoi

    ich hab zwar noch nie maps verwendet, aber bieten die sich in diesem fall wirklich so an ? vielleicht wenn echt nur name und eine nummer gespeichert werden sollen. aber wenn er mal name, festnetz und handynummer haben will, muss er ja wieder von vorne anfangen. oder seh ich das falsch ?

    Meep Meep



  • Nein, die std::map bzw. die std::multimap sind perfekt für Wörterbücher, Inhaltsverzeichnisse, Adressbücher usw. Die multimap kann auch mehrere äquivalente Schlüssel aufnehmen, weshalb es dann aber den []-Operator nicht anbietet. Egal... jedenfalls funktioniert das ganze so:

    struct adresse
    {
         std::string name;
         std::string telefon;
         std::string strasse;
         std::string ort;
         int plz;
         // kann man beliebig erweitern
    };
    
    std::multimap<std::string, adresse> telefonbuch;
    typedef std::multimap<std::string, adresse>::value_type ADRESSE;
    
    adresse a;
    a.name = "Müller";
    a.telefon = "01234/1234-6"
    //...
    
    ADRESSE adr = ADRESSE(a.name, a); // Name ist der Suchschlüssel, Adresse der Wert
    telefonbuch.insert(adr);
    

    Der erste map-Parameter ist ja DER Schlüssel, und das kann dann z.B. der Name aus der Adresse sein. Und der zweite Parameter ist der Wert, der ja alle möglichen Struktur-Informationen beinhalten kann. Man könnte auch in das adresse-struct eine Bitmap als Attribut rein machen, für Fotos der Kontaktperson. 😉

    EDIT: hab einen kleinen Fehler im Code gehabt, ist behoben.



  • Naja,
    das ist ja auch nur ne Beispielimplementierung.
    map ist ja nen Template und du könntest das map Attribut der telefonbuch- Klasse ja auch als map<person,telefonnummern> deklarieren.
    Dann hätte die Klasse person z.B. sämtliche Attribute die man so mit ner Person in Verbindung bringt(Name,Anschrift etc.) und die Klasse telefonnummern könnte sämtliche erdenklichen Telefon,Handy,Fax-nummern.repäsentieren.
    Dann müsstest du halt festlegen wie Personen sortiert werden können und die Methode findeNummer würde auch etwas komplexer.Das würde jetzt aber den Rahmen meiner Motivation,für andere Leute die Hausaufgaben zu machen, sprengen :D.
    Unter dem Strich behaupte ich aber mal:
    Wenn es darum geht eine Assoziation zwischen 2 Klassen(oder Grunddatentypen) herzustellen bietet ne map schon einiges an Komfort,welchen man sich mit anderen Containern erstmal hart selber erarbeiten müsste.

    MfG Spacelord

    EDIT: Da war Artchi wohl etwas schneller 😉



  • p3ac3 schrieb:

    Hallo,
    ich will sone art telefonbuch programmieren aber ich weiß nicht wie ich einträge in einer datei abspeichern soll:(
    und dann auch wieder abrufen,
    könnt ihr mir helfen??
    danke:)

    Weißt du wie man Textdateien in C++ schreibt?

    Im Prinzip musst du dir einfach nur ein Dateiformat definieren. Z.B. in eine normale Textdatei (ASCII) abspeichern, wobei eine Textzeile einer Kontaktadresse entspricht. Die Daten wie Name, Telefon, Strasse usw. separierst du z.B. durch Kommata. Such mal im Netz nach dem CSV Dateiformat.



  • nein hab grad erst angefangen mit c++



  • Spacelord hat ja schon mal einen Ansatz aufgezeigt. Wenn du wirklich noch C++ Anfänger bist, sollte man dir vielleicht einen Hinweis geben.

    Du mußt dich mit den Filestreams ifstream und ofstream beschäftigen. Das sind die Basics um überhaupt Dateien schreiben und lesen zu können. Versuch dich damit zu befassen und dann krallst du dir mein Beispiel und speicherst die einzelnen Attribute vom adresse-struct kommasepariert ab, Stichwort CSV.

    http://de.wikipedia.org/wiki/CSV-Datei

    CSV ist die bekannteste und einfachste Art tabellarische Daten zu speichern. Und ein Telefonbuch ist im einfachsten Fall eine Tabelle.



  • p3ac3 schrieb:

    nein hab grad erst angefangen mit c++

    Dann vergisst du am besten meine Lösung.Vor allem den Teil mit std::map.
    Wie Artchi schon sagte musst du dich dann erstmal mit ifstream und ofstream beschäftigen.Und es tut dir mit Sicherheit gut wenn du dein Telefonbuch dann erstmal doch mit ner struct und vielleicht sogar ner eigenimplementierten Liste oder dergleichen löst.
    Ich persönlich sehe es so dass man sich den STL-Luxus erst dadurch verdienen muss dass man halbwegs versteht was die STL Klassen machen.

    MfG Spacelord


Anmelden zum Antworten