Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo liebe Fachkundige ;D

Am ende ist das beschriebene Programm, nun erstmal zu meinem Problem!

Also ich habe unten stehendes Programm zum Üben von Methoden geschrieben.

Nun dacht ich mir das es ganz cool wäre wenn man die Eingaben von der Methode "eingeben()" in eine Text-Datei speichern könnte?!

Hab nun durch Google die lib <fstream> gefunden, mit er es wohl möglich ist. Jedoch vestehe ich da nichts?

Wie kann man das realisieren? Ich hoffe das ihr mir helfen könnt :)

Danke im Vorraus,

Alex

ps: ja ich weiß das die sleep Anweisungen unnötig sind, aber ich fands halt hübsch^^...

#include <iostream>

#include <string>

#include <conio.h>

#include <cstdlib>

#include <windows.h>

#include <fstream>

using namespace std;



class CBuch

{

  private:

  string verfasser;

  string titel;

  int eJahr, invNr;

  public:

  void ausgeben ()

  {

      cout << "Verfasser: " << verfasser << endl;

      cout << "Titel: " << titel << endl;

      cout << "Erscheinungs Jahr: " << eJahr << endl;

      cout << "Inventarnummer: " << invNr << endl;

  }

  void eingeben ();


};



int main ()

{

    CBuch b1, b2;




    cout << "Die Eingabe fuer Buch 1 wird gestartet ." << endl;

    Sleep(600);

    system("cls");

    cout << "Die Eingabe fuer Buch 1 wird gestartet . ." << endl;

    Sleep(600);

    system("cls");

    cout << "Die Eingabe fuer Buch 1 wird gestartet . . ." << endl;

    Sleep(600);

    system("cls");

    b1.eingeben();

    system("cls");

    cout << "Die Eingabe fuer Buch 2 wird gestartet ." << endl;

    Sleep(600);

    system("cls");

    cout << "Die Eingabe fuer Buch 2 wird gestartet . ." << endl;

    Sleep(600);

    system("cls");

    cout << "Die Eingabe fuer Buch 2 wird gestartet . . ." << endl;

    Sleep(600);

    system("cls");

    b2.eingeben();

    system("cls");


    cout << "Beide Bücher wurden erfolgreich abgespeichert.";

    cout << endl << "Buch 1 hat folgenden Inhalt: " << endl;

    b1.ausgeben();

    cout << endl << "Buch 2 hat folgenden Inhalt: " << endl;

    b2.ausgeben();



    return 0;

}


void CBuch::eingeben ()

{


    cout << "Bitte geben Sie den Verfasser ein: "; getline (cin, verfasser);

    cout << "Nun bitte den Titel: "; getline (cin, titel);

    cout << "Geben Sie nun bitte das Erscheinungs Jahr ein: "; cin >> eJahr;

    cout << "Zuletzt noch bitte die Inventarnummer: "; cin >>invNr;

}

Geschrieben (bearbeitet)



void CBuch::eingeben ()

{

    ofstream Schreiben;

    Schreiben.open("datei.dat",ios::out);    


    cout << "Bitte geben Sie den Verfasser ein: "; getline (cin, verfasser);

    cout << "Nun bitte den Titel: "; getline (cin, titel);

    cout << "Geben Sie nun bitte das Erscheinungs Jahr ein: "; cin >> eJahr;

    cout << "Zuletzt noch bitte die Inventarnummer: "; cin >>invNr;


     Schreiben<<verfasser<<titel<<eJahr<<invNr;


     Schreiben.close();

}

Die Datei befindet sich dann im entsprechenden Projektordner.

Bearbeitet von Mustl
Geschrieben (bearbeitet)


void CBuch::eingeben ()

{

    ofstream Schreiben;

    Schreiben.open("datei.dat",ios::out);    


    cout << "Bitte geben Sie den Verfasser ein: "; getline (cin, verfasser);

    cout << "Nun bitte den Titel: "; getline (cin, titel);

    cout << "Geben Sie nun bitte das Erscheinungs Jahr ein: "; cin >> eJahr;

    cout << "Zuletzt noch bitte die Inventarnummer: "; cin >>invNr;


     Schreiben<<verfasser<<titel<<eJahr<<invNr;


     Schreiben.close();

}

Die Datei befindet sich dann im entsprechenden Projektordner.

Vielen Dank!

Kann mir nun noch jemand erklären wofür die Sachen stehen? Also was sie bewirken? Dann wäre ich rundum zufrieden =) Danke nochmal!

Ach, habe es gerade mal ausprobiert. Der speichert nicht alles, und wenn dan ohnehin nur vom Buch 2 die Eingaben, kann man das noch verfeinern?

Bearbeitet von wikki
Geschrieben (bearbeitet)

Mit ofstream Schreiben; deklariert man eine Variable vom Typ "ofstream".

Mit Schreiben.open("Datei",ios::out); öffnet/erstellt man eine Datei, in die hineingeschrieben wird.

Wenn man in diese Datei dann nochmal reinschreiben will (ohne vorherigen Inhalt zu löschen) nimmt man ios::app

Mit Schreiben<<Inhalt;

schreibt man dann in die Datei hinein, was man will, und mit Schreiben.close() schließt man sie.

Zum herauslesen aus Dateien, nimmt man eine ifstream-Variable und ios::in ,also z.B.

ifstream Lesen("Datei",ios::in);

Damit kann man die Datei auslesen und in eine Variable (z.B. string Zeile; ) speichern, z.B. zeilenweise getline(Lesen,Zeile);

Wenn man die ganze Datei auslesen und auf dem Bildschirm ausgeben will, sieht das etwa so aus :

getline(Lesen,Zeile);

while (!Lesen.eof())

{

cout<<Zeile<<endl;

getline(Lesen,Zeile);

}

Bearbeitet von Mustl
Geschrieben

Nochmals vielen Dank!

Ein Fehler ist noch im Code: Wenn ich im 2. Durchlauf, also bei b2, den Verfasser eingeben will, überspringt es diesen einfach, es erfolgt also sofort nach dem "laden" die abfrage nach dem Titel? Woran kann das liegen :o

Danke nochmals!!

Geschrieben

Hm, sowas liegt meist am Puffer, der hat noch einen Zeilenumbruch drinliegen.

Mal mit cin.sync(); und cin.clear(); (vor dem erneuten Durchlauf) probieren .

Oder auch die anderen Sachen mit getline(cin,...); eingeben lassen.

Geschrieben

void CBuch::eingeben ()
{
ofstream Schreiben("datei.dat");

cout << "Bitte geben Sie den Verfasser ein: "; getline (cin, verfasser);
cout << "Nun bitte den Titel: "; getline (cin, titel);
cout << "Geben Sie nun bitte das Erscheinungs Jahr ein: "; cin >> eJahr;
cout << "Zuletzt noch bitte die Inventarnummer: "; cin >>invNr;

Schreiben<<verfasser<<titel<<eJahr<<invNr;
}
[/CODE]

Auf open() und close() kann und sollte man verzichten. Der Stream-Konstruktor übernimmt das Öffnen gleich mit, und der Destruktor übernimmt das Schließen. Je früher man sich RAII angewöhnt, desto besser. Die Angabe von ios::out bei ofstream (sowie ios::in bei ifstream) ist auch überflüssig.

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