Projekt: Hilfe bei der Speicherung von eingetragenen Daten.



  • Halli Hallo,
    ich habe vor kurzem mit C++ Programmierung angefangen und habe als erstes größeres "Projekt" eine Art Notizbuch geschrieben. Es gibt ein kleines Menü mit dem man zwischen "Daten Eintragen "Daten Einsehen" und "Zurueck zum Hauptmenue" wechseln kann. Das alles habe ich jz über eine Konsole laufen lassen. Eigentlich bin ich auch ganz Zufrieden mit Ergebnis. Als letztes würde ich aber gerne, die Daten speichern, die ich eingetragen habe, sodass die Daten auch nach Programmschluss noch in der Liste bleiben.

    Ich poste mal den Code, für die vllt. etwas verwirrt sind :D.

    #include <iostream>
    #include <string>
    #include <stdlib.h>
    using std::cout;
    using std::cin;
    using std::endl;
    using std::string;
    
    void func_start_menu();
    void func_eingabe_menu();
    void func_ausgabe_menu();
    
    class employee
    {	public: 
    	employee()	{};
    	~employee()	{};
    
    	int i =0;
    	int j =0;
    	int k =0;
    	int c=0;
    
    	string get_name(){return name[i];};
    	int 	get_alter(){return alter[j];};
    	string 	get_geburtsdatum(){return geburtsdatum[k];};
    
    	void set_name(string name_value){name[i]= name_value;};
    	void set_alter(int number_value){ alter[j]= number_value; };
    	void set_geburtsdatum(string geburt_value){geburtsdatum[k]= geburt_value;};
    
    	private:
    		string name[10];
    		int alter[10];
    		string geburtsdatum[10];
    
    };
    
    employee objekt1;
    
    void func_eingabe_menu()
    {	system("cls");
    
    	int bestaetigung = 1;
    	string nam;
    	int nummer;
    	string geb;
    
    		while(bestaetigung)
    	{
    		cout << "geben sie den namen ein: " << endl;
    		cin >> nam;
    		objekt1.set_name(nam);
    		objekt1.i++;
    
    		cout << "geben sie das alter an ein: " << endl;
    
    			cin >> nummer;
    			objekt1.set_alter(nummer);
    			objekt1.j++;
    
    		cout << "geben sie das geburtsdatum ein: " << endl;
    		cin >> geb;
    		objekt1.set_geburtsdatum(geb);
    		objekt1.k++;
    		objekt1.c++;
    
    		cout << "<0> zurrueck ins menue <1> um weiter zu machen" << endl;
    		cin >> bestaetigung;
    
    	}
    
    }
    
    void func_ausgabe_menu()
    {	system("cls");
    	int bestaetigung_1;
    
    	cout << "name:			alter:			geburtsdatum:" << endl;
    	for (objekt1.i=0, objekt1.j=0, objekt1.k=0; objekt1.i<objekt1.c; objekt1.i++,objekt1.j++,objekt1.k++)
    	{	
    
    		cout << objekt1.get_name() << "			" << objekt1.get_alter() << "			" << objekt1.get_geburtsdatum()<< "			" << endl;
    
    	}
    
    	cout << "<0> zurrueck ins menue." << endl;
    	cin >> bestaetigung_1;
    
    }
    
    void func_start_menu()
    {  
    	int eingabe;
    
    	while(true)
    	{
    	system("cls");
    
    	cout << "---------------------------------------------------------------------------" << endl;
    	cout << "			Willkommen im Notizbuchprojekt!	             " << endl;
    	cout << "		-Druecke 1 um einen neuen Eintrag auszufuehren"	   << endl;
    	cout << "		-Druecke 2 um die bisherigen Einträge einzusehen"   << endl;
    	cin >> eingabe;	
    
    	if(eingabe ==1)
    	{
    		func_eingabe_menu();
    	}
    	else
    	if (eingabe == 2)
    	{
    		func_ausgabe_menu();
    	}
    }
    }
    
    int main()
    {
    	func_start_menu();
    }
    

    Ich hatte mir überlegt mit der fstream bibo die eingetragenen Daten vllt. in einer Datei zwischenzuspeichern und dann bei Programmstart wieder in die Datei einzutragen. Aber bei jedem Programmstart löscht sich die Liste wieder D:.
    Gibts vllt. noch andere Lösungsvorschläge?
    Danke schonmal fürs lesen 🙂 .
    MfG
    BlackJoe



  • Dann solltest du uns besser den Code für das Lesen und Schreiben der Datei sowie deren Verwendung zeigen.



  • Stimmt. Sorry.

    #include <iostream>
    #include <string>
    #include <stdlib.h>
    #include <fstream>
    
    using std::cout;
    using std::cin;
    using std::endl;
    using std::string;
    
    void func_start_menu();
    void func_eingabe_menu();
    void func_ausgabe_menu();
    
    class employee
    {	public: 
    	employee()	{};
    	~employee()	{};
    
    	int i =0;
    	int j =0;
    	int k =0;
    	int c=0;
    
    	string get_name(){return name[i];};
    	int 	get_alter(){return alter[j];};
    	string 	get_geburtsdatum(){return geburtsdatum[k];};
    
    	void set_name(string name_value){name[i]= name_value;};
    	void set_alter(int number_value){ alter[j]= number_value; };
    	void set_geburtsdatum(string geburt_value){geburtsdatum[k]= geburt_value;};
    
    	private:
    		string name[10];
    		int alter[10];
    		string geburtsdatum[10];
    
    };
    
    employee objekt1;
    
    void func_eingabe_menu()
    {	system("cls");
    
    	int bestaetigung = 1;
    	string nam;
    	int nummer;
    	string geb;
    
    		while(bestaetigung)
    	{	
    		cout << "geben sie den namen ein: " << endl;
    		cin >> nam;
    		objekt1.set_name(nam);
    		objekt1.i++;
    
    		cout << "geben sie das alter an ein: " << endl;
    
    			cin >> nummer;
    			objekt1.set_alter(nummer);
    			objekt1.j++;
    
    		cout << "geben sie das geburtsdatum ein: " << endl;
    		cin >> geb;
    		objekt1.set_geburtsdatum(geb);
    		objekt1.k++;
    		objekt1.c++;
    
    		cout << "<0> zurrueck ins menue <1> um weiter zu machen" << endl;
    		cin >> bestaetigung;
    		std::ofstream schreiben("notizbucht.dat");
    		schreiben.write((char*)&objekt1, sizeof(employee));
    		schreiben.close();
    	}
    
    }
    
    void func_ausgabe_menu()
    {	system("cls");
    	int bestaetigung_1;
    	std::ifstream lesen("notizbucht.dat");
    	lesen.read((char*)&objekt1, sizeof(employee));
    	lesen.close();
    
    	cout << "name:			alter:			geburtsdatum:" << endl;
    	for (objekt1.i=0, objekt1.j=0, objekt1.k=0; objekt1.i<objekt1.c; objekt1.i++,objekt1.j++,objekt1.k++)
    	{	
    
    		cout << objekt1.get_name() << "			" << objekt1.get_alter() << "			" << objekt1.get_geburtsdatum()<< "			" << endl;
    
    	}
    
    	cout << "<0> zurrueck ins menue." << endl;
    	cin >> bestaetigung_1;
    
    }
    
    void func_start_menu()
    {  
    	int eingabe;
    
    	while(true)
    	{
    	system("cls");
    
    	cout << "---------------------------------------------------------------------------" << endl;
    	cout << "			Willkommen im Notizbuchprojekt!	             " << endl;
    	cout << "		-Druecke 1 um einen neuen Eintrag auszufuehren"	   << endl;
    	cout << "		-Druecke 2 um die bisherigen Einträge einzusehen"   << endl;
    	cin >> eingabe;	
    
    	if(eingabe ==1)
    	{
    		func_eingabe_menu();
    	}
    	else
    	if (eingabe == 2)
    	{
    		func_ausgabe_menu();
    	}
    }
    }
    
    int main()
    {
    	func_start_menu();
    }
    

    Das wäre der code mit fstream.
    Wenn ich es richtig verstanden habe, dann kann man mit ofstream/ifstream.write bzw . read, dann die daten einer eines klassenobjekts ein und auslesen. Das heißt in diesem fall hatte ich vor, die daten des gesamten objekts in eine binärdatei einzulesen bei func_eingabe_menu() und dann in die func_ausgabe_menu() auszugeben.



  • Nee, das wird so nicht funktionieren.



  • Deine Employeeklasse ist ziemlich übel. Wenn du mehrere Mitarbeiter verwalten willst, sollten die Arrays nicht in der Klasse selber verwaltet werden. Noch besser ist es, gleich einen std::vector zu verwenden:

    class employee
    {   public:
        employee(const string& name, int alter, const string& geburtsdatum) : name(name), alter(alter), geburtsdatum(geburtsdatum)  {};
    
        string get_name() const {return name;};
        int     get_alter() const {return alter;};
        string  get_geburtsdatum() const {return geburtsdatum;};
    
        private:
            string name;
            int alter;
            string geburtsdatum;
    };
    ...
    std::vector<employee> employees;
    ...
    employees.push_back( employee( "Meier", 40, "1.3." ) );
    ...
    for( std::vector<employee>::iterator it = employees.begin(); it != employees.end(); ++it ) {
        std::cout << it->get_name() << " " << it->get_alter() ...
    }
    

    Und mit C++11 könnte man das noch vereinfachen.



  • Deine Employeeklasse ist ziemlich übel. Wenn du mehrere Mitarbeiter verwalten willst, sollten die Arrays nicht in der Klasse selber verwaltet werden

    Wie macht man das dann am besten, habe ein ähnliches Problem . Als Freie Funktion, oder eine weitere Klasse die den Vecotr enthält?


  • Mod

    Desing_? schrieb:

    Deine Employeeklasse ist ziemlich übel. Wenn du mehrere Mitarbeiter verwalten willst, sollten die Arrays nicht in der Klasse selber verwaltet werden

    Wie macht man das dann am besten, habe ein ähnliches Problem . Als Freie Funktion, oder eine weitere Klasse die den Vecotr enthält?

    Wie sollte eine Funktion Daten halten? Eine Funktion tut etwas, sie ist kein "Ding" (außer im Sinne einer "Handlung").

    PS: Du plenkst.


Anmelden zum Antworten