Variabelnverbund (Struct) in Datei abspeichern



  • Hallo liebe Gemeinde,

    folgendes: Ich schreibe ein Programm, welches den Benutzer erstmal nach sämtlichen Daten ausfragt, d.h., Name, Telefon, Plz, etc.

    Dafür habe ich ein StructDatentyp angelegt. Die Structvariable ist ein Array mit 10 Plätzen; ist es möglich, alle Parameter dieses Arrays (z.B. kd_daten[0].name, kd_daten[0].plz, ...) auf ein Schlag in eine Datei zu schieben?

    Momentan mache ich es so, dass ich eine Funktion zum Abspeichern habe und die Funktion 4 mal aufrufe, d.h., für jeden einzelnen Parameter einmal - kleiner Auszug:

    // In VarKiste schieben
    				auswahl[kto_position].name = input_name;
    				save_file(pfad_daten, kto_position, input_name);
    
    				int input_num;
    				cout << "Plz: ";
    				cin >> input_num;
    				auswahl[kto_position].plz = input_num;
    				save_file(pfad_daten, kto_position, input_num);
    
    				cout << "Tel: ";
    				cin >> input_num;
    				auswahl[kto_position].tel_nr = input_num;
    				save_file(pfad_daten, kto_position, input_num);
    

    ...und die Funktion:

    void save_file(string pfad, int pos_kd, string data_kd)
    {
    	string files_all;
    
    	if (pos_kd != -1)
    	{
    		files_all += pos_kd+'0';
    	}
    	else
    	{
    		files_all += '\n';
    	}
    
    	files_all += data_kd;
    
    	// Index schreiben
    	kto_info.open("c:/TEST/info.txt", ios::out);
    	kto_info << files_all;
    	kto_info.close();
    }
    

    (Der Pfadparameter der Fkt. ist noch überflüssig, ich weiß)

    Geht das vlt. irgendwie eleganter? Irgendwie ist das doof so....

    Gruß


  • Mod

    #include <string>
    #include <iostream>
    #include <fstream>
    #include <vector>
    
    using namespace std;
    
    struct data
    {
      string name;
      string telefonnummer;
      string postleitzahl;
    };
    
    ostream& operator<<(ostream &out, data const &rhs)
    {
      out << "Name: " << rhs.name << '\n'
          << "Tel.: " << rhs.telefonnummer << '\n'
          << "Plz.: " << rhs.postleitzahl << '\n';
      return out;
    }
    
    istream& operator>>(istream &in, data &rhs)
    {
      cout << "Name? ";
      in >> rhs.name;
      cout << "Telefonnummer? ";
      in >> rhs.telefonnummer;
      cout << "Postleitzahl? ";
      in >> rhs.postleitzahl;
      return in;
    }
    
    int main()
    {
      vector<data> daten;
    
      {
        cout << "Datensätze eingeben. Zum Beenden CTRL+Z (Win/DOS) oder CTRL+D (Mac/Unix)\n\n";
        data input;
        while (cin >> input)
          daten.push_back(input);
      }
    
      {
        ofstream out("info.txt");
        for (size_t i = 0; i < daten.size(); ++i)
          out << daten[i] << '\n';
      }
    }
    


  • Hallo Sepp,

    dankeschön erstmal für deine Antwort!

    Das sieht ja schon mal ein gewaltiges Stück komplizierter aus - ich arbeite das heute Abend mal durch. Hoffentlich komm ich dahinter. Auf jeden Fall tuts das, was ich mir erhoffe; melde mich dann bzgl. Fragen.

    Gruß



  • @SeppJ: Meinst du wirklich es ist so günstig, wenn der Input-Operator nebenbei nach cout schreibt? Davon abgesehen würde ich die Operatoren symmetrisch aufbauen.


  • Mod

    CStoll schrieb:

    @SeppJ: Meinst du wirklich es ist so günstig, wenn der Input-Operator nebenbei nach cout schreibt? Davon abgesehen würde ich die Operatoren symmetrisch aufbauen.

    Nein, das halte ich nicht für günstig, aber für lehrreich, damit er überhaupt mal Operatorüberladung sieht und das Programm einigermaßen gut aussieht.


Anmelden zum Antworten