Zum Inhalt springen

Datei Eingabe/Ausgabe


TommoA

Empfohlene Beiträge

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;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen


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

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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..

Link zu diesem Kommentar
Auf anderen Seiten teilen

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. :D;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

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);


		}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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();







	}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

		}


	}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...