Inhalt aus Textdatei, auf Console ausgeben lassen.



  • Guten Abend,
    ich habe folgendes Problem. Ich schreibe ein klines Verwaltungsprogramm, wo max. 10 Artikel und deren Daten eingegeben werden können.
    Aufgabenstellung ist es, diese 10 Artikel komplett einzugeben und danach wieder ausgeben zu lassen.
    Da dachte ich mir, dass ich alle Daten in eine txt-Datei schreibe und nach der Eingabe, alles wieder auf den Bildschirm ausgebe.
    Nur fehlt mir hierbei das genau Wissen, wie ich diese Daten einfach und ohne großen Aufwand wieder ausgeben kann.

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    struct Lagerverwaltung
    {
    	char Artikelnummer[20];
    	char Artikelname[50];
    	char Lagerbestand[10];
    	float Artikelpreis;
    };
    
    int main()
    {
    	fstream Datei;
    	Lagerverwaltung a;
    	int Datensatz=1,Frage;
    
    	do
    	{
    		cout<<"Aufnahme der Daten";
    		cout<<"\n";
    		cout<<"******************";
    		cout<<"\n\n";
    		cout<<"Artikelnummer: ";
    		cin>>a.Artikelnummer;
    		cout<<"\n";
    		cout<<"Artiklename: ";
    		cin>>a.Artikelname;
    		fflush(stdin);
    		cout<<"\n";
    		cout<<"Lagerbestand: ";
    		cin>>a.Lagerbestand;
    		cout<<"\n";
    		cout<<"Artikelpreis (in Euro): ";
    		cin>>a.Artikelpreis;
    		cout<<"\n\n";
    
    		Datei.open("Verwaltung.txt", ios::out | ios::app);
    		Datei<<"Artikelnummer: " <<a.Artikelnummer;
    		Datei<<"\n";
    		Datei<<"Artikelname: " <<a.Artikelname;
    		Datei<<"\n";
    		Datei<<"Lagerbestand: " <<a.Lagerbestand;
    		Datei<<"\n";
    		Datei<<"Artikelpreis (Euro): " <<a.Artikelpreis;
    		Datei<<"\n\n\n";
    		Datei.close();
    		system("cls");
    
    		cout<<"Wollen Sie einen weiteren der 10 moeglichen Datensatze speichern? (Ja=1, Nein=0)";
    		cin>>Frage;
    		if(Frage==0)
    		{
    			cout<<"\n\n";
    			break;
    		}
    		if(Datensatz==10)
    		{
    			cout<<"\n\n";
    			cout<<"Sie haben die maximale Anzahl an Datensaetzen erreicht (10) !";
    			cout<<"\n\n";
    			break;
    		}
    		else
    		{
    			Datensatz++;
    			system("cls");
    		}
    
    	}
    	while(Datensatz<=10);
    }
    

    Danke im Vor-raus, für jede Hilfestellung.
    Bitte beachtet, dass ich noch Anfänger bin und vielleicht nicht gleich jeden Gedanken von euch auf Anhieb verstehe.



  • Mal so den Sourcecode überflogen. Folgender Hinweis: eine Datei wird bennant und geöffnet bevor sie gebraucht wird und geschlossen wenn sie nicht mehr gebraucht wird. Innerhalb einer do-while-Schleife haben open und close nichts zu suchen. Dort willst du ja hineinschreiben! Und siehe nach, ob nach dem Programmende deine Datei existiert und was darin steht.



  • Wenn Du Dein Programm hast laufen lassen, hat es Dir dann die von Dir gewünschte Textdatei mit den korrekten Inhalten erstellt? (Ich habe es mir nicht angesehen)
    Wenn ja, dann kannst Du in der Folge die Datei zum Lesen öffnen:

    ifstream in("dateiname.txt");
    

    und mit dem >> Operator nacheinander die Bestandteile wieder einlesen, wie Du sie geschrieben hast:

    Lagerverwaltung b;
    
    while(in)
    {
       in >> b.Artikelnummer;
       in >> b.Artikelname;
       ...
    
       //so ohne weiteres funktioniert das aber nur, wenn die geschriebenen Strings keine Leerzeichen enthalten!
    
       //Danach dann mit cout auf die Konsole und den nächsten ...
    }
    


  • @berniebutt: Ja die TXT wird erstellt und es steht auch das drin, was ich haben möchte.
    @Belli: Schonmal vielen Dank, für deine Antwort, aber gibt es nicht einen Befehl, mit dem ich einfach den ganzen Inhalt ausgeben kann? Ohne jetzt jeden String nochmal einzelnt einzulesen? Weil ich möchte ja zuerst 10 mal die Eingabe machen (siehe Schleife) und danach alles direkt ausgeben und nicht stück für stück.



  • Lukas93 schrieb:

    @berniebutt: Ja die TXT wird erstellt und es steht auch das drin, was ich haben möchte.
    @Belli: Schonmal vielen Dank, für deine Antwort, aber gibt es nicht einen Befehl, mit dem ich einfach den ganzen Inhalt ausgeben kann? Ohne jetzt jeden String nochmal einzelnt einzulesen? Weil ich möchte ja zuerst 10 mal die Eingabe machen (siehe Schleife) und danach alles direkt ausgeben und nicht stück für stück.

    Das ist ein Gedanke, von dem du dich möglichst schnell verabschieden solltest. Die Datenablage ist in diesem Fall rein zufällig Klartext, davon kannst du aber nicht immer ausgehen. Statt das auszunutzen solltest du einen Weg wählen, der unabhängig vom Format der gespeicherten Daten funktioniert, und der führt über das Einlesen der Daten und der anschließenden Ausgabe.

    Als nächstes könntest du dein Programm in logische Teilprobleme zerlegen:

    1. Einlesen der Daten aus einer Textdatei
    2. Schreiben der Daten in eine Textdatei
    3. Ausgabe der vorhandenen Daten
    4. Eingabe von Daten

    Im Moment kann man beliebig viele Datensätze in die Datei schreiben, weil jeder Datensatz an das Dateiende angehängt wird. Die Begrenzung auf 10 Datensätze beschränkt sich auf max. 10 neue Einträge pro Programmlauf, d.h. wenn ich das Programm mehrmals starte und beende kann ich beliebig viele Datensätze erzeugen.

    Edit:
    Die Abfrage für weitere Datensätze (0|1) scheint mir auch etwas umständlich, warum nicht (J|N) ?



  • Ungetestet:

    #include <algorithm>
    #include <iterator>
    
    //....
    std::istream_iterator<std::string> it(in);
    std::istream_iterator<std::string> eof;
    std::copy(it, eof, std::ostream_iterator<std::string>(cout) );
    

  • Mod

    pyhax schrieb:

    Ungetestet:

    #include <algorithm>
    #include <iterator>
    
    //....
    std::istream_iterator<std::string> it(in);
    std::istream_iterator<std::string> eof;
    std::copy(it, eof, std::ostream_iterator<std::string>(cout) );
    

    Rube-Goldberg-Maschine.

    Einfacher:

    ifstream datei("Test.test");
    cout << datei.rdbuf();
    


  • @docshoe:
    Das mein Programm 10 weitere Daten pro Programmstart erzuegen und in die txt hineinschreiben kann, weiß ich.
    Meine Frage war lediglich, wie ich alle Daten möglichst ohne großen (wenns geht auf einmal) Aufwand im Konsolenprogramm wieder ausgeben kann.

    EDIT:
    @SeppJ: Vielen Dank, genau das was ich gesucht habe. Alles ausgeben mit zwei Zeilen Code. Vielen Dank.



  • Ah, ok. Kürzer und einfacher als die Lösung von SeppJ wird´s wohl nicht gehen.
    Du solltest allerdings std::string statt char[20] benutzen, denn da kann dir dein Programm bei langen Eingaben um die Ohren fliegen.



  • Hallo, da ich gerade ein ähnliches Programm schreibe und ich das Speichern und Wiedergeben von Dateien interessant fand,
    Frage ich mich wie man überprüft ob die einzulesende Datei überhaupt existiert, bevor das Programm versucht sie auszugeben.

    void adresseCS::DateiAusgeben()
    {
      std::ifstream Datei("Verwaltung.txt");
      std::cout << Datei.rdbuf(); 
    }
    

    so sieht die Methode aus, falls die Verwaltung.txt nicht existiert befindet sich das Programm bei mir zurzeit in einer Art Endlosschleife.
    Müsste also sowas wie eine if-Abfrage in die Methode vor die ifstream Ausgabe setzen, jedoch weiss ich nicht wie die Bedingung dazu aussieht



  • if(!Datei.good() ) { //Fehler ... }
    

Anmelden zum Antworten