Datei auslesen



  • Hallo Leute

    Ich hab ein grosses Problem.
    Mein Programm das ich zusammengeschustert habe liebt mich nicht.
    Ich kann zwar Weine anlegen und Anzeigen,aber sobald ich aus dem Programm aus und wieder einsteige ist alles weg.
    Es muss am einlesen in die Datei in den Statischen Speicher was zu tun haben.

    Ich weiss mittlerweile das man so ein Programm heute anders schreibt, aber wir verwenden den alten Borland 5.02.
    Den neuen Programmstil im Kurs nicht soweit besprochen.

    #include <iostream.h>
    #include <iomanip.h>
    #include <fstream.h>
    #include <string.h>
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <dos.h>
    
    //Definition der Funktionstasten
    #define F1 1
    #define F2 2
    #define F3 3
    #define F4 4
    #define F5 5
    #define F6 6
    #define F7 7
    #define F8 8
    #define F9 9
    #define F10 10
    
    #define EINZUGMENU 15
    #define EINZUGTEXT 15
    
    //Globale Datendefinitionen
    const short MAXCHAR = 40;
    const int MAXWEINE = 5;
    
    // Struktur für Datum format
    struct datum
    {
    	int tag;
    	int monat;
    	int jahr;
    };
    
    // Struktur für Informationen der SWeine
    struct SWein
    {
    	char art[MAXCHAR];                //Zeichenkette für Wein art
       int stueckzahl;
       int wnr;                          //					  Wein NR.
       char name[MAXCHAR];               //					  Wein Namen
       char jahrgang[MAXCHAR];           //					  Wein Jahrgang
       char herkunftsland[MAXCHAR];      //					  Wein Herkunftsland
       char einlagerungsdatei;           //					  Wein Einlagerungsdatum
      	datum datum;
       double preis;                     //					  Wein Preis
    };
    
    //Funktionsdeklarationen
    int menu();
    void weinErfassen(SWein sammlung[], int &aktAnz);
    void weinAnzeigen(SWein sammlung[], int aktAnz);
    void weinAendern(SWein sammlung[], int aktAnz);
    void weinAusbuchen(SWein sammlung[], int &aktAnz);
    
    //Hilfsfunktionen
    int fileRead(char* strfile,  const SWein* meineweine, int &anz);
    int fileSave(char* strfile, SWein* meineweine, int anz);
    int fkt_taste();
    
    // Hauptprogramm
    int main()
    
    {  //Statischer Speicher fuer MAXWEINE
       struct SWein sammlung[MAXWEINE];
       int aktAnz = 0, auswahl;
    
       //Daten aus Datei einlesen
       fileRead("weindaten.dat",sammlung,aktAnz);
       do{
       	auswahl = menu();
          switch(auswahl){
          	case F10:	//Anwendung beenden
             	clrscr();
                fileSave("weindaten.dat",sammlung, aktAnz++);
             	cout << "happy trails...";
                sleep(1);
                break;
    			case F1:	//Daten Weine erfassen
             	cout << endl << aktAnz;
                getch();
             	weinErfassen(sammlung,aktAnz);
             	break;
             case F2:	//Daten aller Weine anzeigen
             	weinAnzeigen(sammlung, aktAnz);
             	break;
             case F3:	//Weine suchen und aendern anhand eines kriteriums
             	weinAendern(sammlung,aktAnz);
             	break;
             case F4: //Weine ausbuchen
             	weinAusbuchen(sammlung, aktAnz);
             	break;
             case F5: //Eingegebene Daten Sichern
             	clrscr();
                fileSave("weindaten.dat",sammlung, aktAnz);
                break;
             default:	//Alle anderen Faelle
             	break;
       	}
       }while(auswahl != F10);
       return(0);
    }
    
    //Funktionsdefinitionen
    //Hauptfunktionen
    //Menufunktione gibt Menue aus und liest Auswahl des Benutzers ein und gibt diese
    //als int zuerueck
    int menu(){
    	//Lokale Daten
       char auswahl;
       do{
    		clrscr();
          cout.setf(ios::right,ios::adjustfield);
          cout << setw(EINZUGMENU) << "" << "Menue Weinverwaltung\n\n\n";
          cout << setw(EINZUGMENU) << "F 1" << "\tWeine erfassen" << endl << endl;
          cout << setw(EINZUGMENU) << "F 2" << "\tWeine anzeigen" << endl << endl;
          cout << setw(EINZUGMENU) << "F 3" << "\tWeine aendern" << endl << endl;
          cout << setw(EINZUGMENU) << "F 4" << "\tWeine ausbuchen" << endl << endl;
          cout << setw(EINZUGMENU) << "F 5" << "\tEingegebene Daten Sichern" << endl << endl;
          cout << setw(EINZUGMENU) << "F10" << "\tBeenden" << endl << endl;
          //Bedienung ueber Funktionstasten F1 - F10, fuer F1 bekommt man 1 zuerueck usw.
          auswahl = fkt_taste();
       }while(auswahl < F1 || auswahl > F10);
     	return auswahl;
    }
    //Funktionsdefinitionen (Implementierungen)
    void weinErfassen(SWein sammlung[], int &aktAnz)
    {
    	char x;
    	clrscr();
       cout.setf(ios::right,ios::adjustfield);
       do
       {
          cout << "Weinnummer eingeben > " ;
          cin >> sammlung[aktAnz].wnr;
          if (sammlung[aktAnz].wnr==0)
    			return;
          cout << "Vorhandene Stueckzahl eingeben > " ;
          cin >> sammlung[aktAnz].stueckzahl;
          cout << "Wein-Art(Rotwein, Weisswein) > ";
          cin >> sammlung[aktAnz].art;
    	   cout << "Name (ohne Zwischenraeume) > ";
    	   cin >> sammlung[aktAnz].name;
          cout << "Jahrgang (jjjj) > ";
    	   cin >>  sammlung[aktAnz].jahrgang;
          cout << "Herkunftsland > ";
          cin >> sammlung[aktAnz].herkunftsland;
    	   cout << "Einlagerungsdatum(tt mm jj) > ";
    	   cin >> sammlung[aktAnz].datum.tag >>sammlung[aktAnz].datum.monat
    	   >> sammlung[aktAnz].datum.jahr;
    	   cout << "Preis (Euro) > ";
    	   cin >> sammlung[aktAnz].preis;
          aktAnz++;
          cout<<"Wollen Sie weitermachen? Ja/Nein: ";
          cin >> x;
    	}while(x!='n');
       clrscr();
       return;
    }
    
    void weinAnzeigen(SWein sammlung[], int aktAnz)
    {
    	clrscr();
       cout.setf(ios::right,ios::adjustfield);
       cout<<"===================================================\n\n";
       for(int i = 0; i < aktAnz; i++)
       {
       	cout << "SWeinnummer: " << sammlung[i].wnr << endl;
          cout << "Vorhandene Stueckzahl: "  << sammlung[i].stueckzahl<< endl;
          cout << "Art: "  << sammlung[i].art << endl;
          cout << "Name: " << sammlung[i].name << endl;
          cout << "Jahrgang: " << sammlung[i].jahrgang << endl;
          cout << "Herkunftsland: " << sammlung[i].herkunftsland << endl;
          cout << "Einlagerungsdatum: " << sammlung[i].datum.tag << "." << sammlung[i].datum.monat
          << "." << sammlung[i].datum.jahr << endl;
          cout << "Preis: " << sammlung[i].preis << endl << endl;
          cout << "-----------------------------\n";
    	}
       cout<<"Weiter mit beliebiger Taste...";
       getch();
       clrscr();
       return;
    }
    
    void weinAendern(SWein sammlung[], int aktAnz)
    {
       clrscr();
       cout.setf(ios::right,ios::adjustfield);
       for(int i = 0; i < aktAnz; i++)
       {
    
          cout<<"Bitte gesuchte SWeinnummer eingeben: ";
          cin>>i;
          if(sammlung[i].wnr==i);
          {
          cout << "Vorhandene Stueckzahl: \t\t\t" << sammlung[i].stueckzahl<< endl;
          cout << "Art:\t\t\t" << sammlung[i].art <<"\n";
          cout << "Name:\t\t\t" << sammlung[i].name <<"\n";
          cout << "Jahrgang:\t\t" << sammlung[i].jahrgang <<"\n";
          cout << "Herkunftsland:\t\t" << sammlung[i].herkunftsland <<"\n";
          cout << "Einlagerungsdatum:\t" << sammlung[i].datum.tag << "." << sammlung[i].datum.monat
               << "." << sammlung[i].datum.jahr <<"\n";
    	   cout << "Preis:\t\t\t" << sammlung[i].preis << "\n";
          }
          while(i != 'n')
          cout << "Wollen Sie weiter suchen? Ja/Nein: ";
          cin >> i;
       }
       cout<<"\nWeiter mit beliebiger Taste...";
       getch();
       clrscr();
       return;
    }
    
    void weinAusbuchen(SWein sammlung[], int &aktAnz)
    {
       char x;
       int i, anz;
    	clrscr();
       cout.setf(ios::right,ios::adjustfield);
       do
       {
          clrscr();
       	cout << "Bitte gesuchte Weinnummer eingeben: ";
    	   cin >> x;
          //Suche Index im Array des Weines mit der Weinnummer x
    		for(i = 0;x == sammlung[i].wnr; i++);
    
          cout << "Wieviele Falschen moechten sie ausbuchen > ";
          cin >> anz ;
          if(sammlung[i].stueckzahl < anz)
          {
      	      cout << "Ihre Buchhaltung stimmt nicht, es sind nicht mehr soviele Flaschen vorhanden";
             getch();
          }
          else
          	if(sammlung[i].stueckzahl == anz)
             {
             	//Was mache ich, wenn dies zutrifft?? Loesche ich den Wein kplt. oder nur stueckzahl auf 0??
                cout << "\nWollen Sie den Eintrag loeschen? Ja/Nein: ";
                //cout<<"\nWollen Sie den Eintrag loeschen? Ja/Nein: ";
                cin >> x;
    			   //cin >> x;
             }
             else
             	if(sammlung[i].stueckzahl > anz)
             		sammlung[i].stueckzahl = sammlung[i].stueckzahl - anz;
    		cout << "Wollen Sie weitere Weine ausbuchen? Ja/Nein: ";
          cin >> x;
       }while(x != 'n');
    
       getch();
       clrscr();
       return;
    }
    
    //Hilfsfunktionen
    //fileRead liest Datei ein und alloziert dynamisch Speicher fuer alle Elemente und liest Sie ein
    int fileRead(char* strfile, const SWein* meineweine, int &anz){
    
    	//Inputfilestream - Objekt, quasi Pointer auf die Dateien
    	ifstream dat_ein;
      	//Eingabedatei oeffnen
      	dat_ein.open( strfile, ios::in||ios::binary);
       //Check ob's funktioniert hat
      	if (!dat_ein){
       	cerr << "Datei konnte nicht geoeffnet werden!\n";
        	return 1;
       }
       //1. Anzahl Elemente in Datei zaehlen
       anz = dat_ein.gcount() / sizeof(struct SWein);
      	//Strukturen einlesen
       for(int i = 0; i < anz; i++){
    	  	dat_ein.read((char *) &meineweine[i],sizeof(struct SWein));
       }
     	//File unbedingt schliessen nach Gebrauch
      	dat_ein.close();
    	return 0;
    }
    
    //fileSave speichert Daten eines Arrays in eine Datei, welche per Parameter uebergeben werden
    int fileSave(char* strfile, SWein* meineweine, int anz){
    	//Outputfilestream - Objekt, quasi Pointer auf die Dateien
    	ofstream dat_aus;
    
      	// Ausgabedatei oeffnen
      	dat_aus.open(strfile, ios::out||ios::binary);
    
       //Check ob's funktioniert hat
      	if (!dat_aus){
        	cerr << "Datei konnte nicht geoeffnet werden!\n";
        	return 1;
       }
    
      	// Array mit Strukturen binaer in Datei schreiben
      	dat_aus.write((char *)meineweine, sizeof(struct SWein)*MAXWEINE);
    	//File unbedingt schliessen nach Gebrauch
      	dat_aus.close();
    	return 0;
    }
    
    //Erkennen der Funktionstaste
    int fkt_taste()        /* Erkennung der Funktionstasten F1...F10 */
    {
    	int Nummer=20;                                        /* Nummer der Taste */
    	char ch=0;                                         /* Charakter der Taste */
       do{
       	do {} while (!kbhit());                       /* Auf Tastendruck warten */
    		ch = getch();
    		if ((ch==0) && (kbhit)){
          	ch = getch();
    			Nummer = ch-58;	                /* ch = #0   => Fkt-Taste allgemein */
    		}		                              /* Nummer der Funtionstaste ermitteln */
    	}while ((Nummer<1) || (Nummer>10));   /* solange bis Fkt-Taste F01 bis F10 */
    	return Nummer;
    };
    

    Wäre für jede Hilfe dankbar.

    Gruss tinile

    😃 😃 😃

    Bitte Code-Tags verwenden



  • sorry, aber benutze bitte code-tags!
    glaube nicht das sich das ganze so jemand anschaut!



  • Hallo,

    formatier den Quelltext erst einmal mit Hilfe der cpp-Tags. Das ist so ueberhaupt
    nicht uebersichtlich.

    Desweiteren waere es gut, wenn du erstmal nur den Code postest, der deiner
    Meinung nach nicht korrekt arbeitet. Stellt sich dieser als korrekt dar, kann
    man immernoch weitere Teile posten. Ein ganzes Programm zu posten hat immer sowas
    von "Hier habt ihr meinen Quelltext, nun macht ihr mal" und dagegen straeube ich
    mich irgendwie.

    mfg
    v R



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-129186-and-start-is-0.html

    Wo kriegt man eine Weinverwaltung als Haufaufgabe?



  • Sorry Leute
    Kann mir einer miteilen wie man den cpp-tags anwendet? (C/C++,Code,Quote)???

    Es ist keine Hausaufgabe.Ist ein Kursabschlussprojekt.

    Ich weiss leider nicht welcher Bereich richtig arbeitet.

    Gruss
    Tinile



  • tinile schrieb:

    Sorry Leute
    Kann mir einer miteilen wie man den cpp-tags anwendet? (C/C++,Code,Quote)???

    Ja. Unsere Forum FAQ:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39411.html



  • HumeSikkins

    Vielen Dank für Deinen Hinweis.

    👍 👍



  • Für was den eine for schleife beim weinAnzeigen?
    Habe nicht so einen alten Boreland zum compellieren installiert.
    Las mal die schleife weg.



  • Salü

    Ich bin mir nicht sich ob der Befehl zum "Datei aus der Datei einzulesen" richtig ist. fileRead("weindaten.dat",sammlung,aktAnz);
    Die Funktion Anzeigen findet nichts.

    //Hilfsfunktionen 
    int fileRead(char* strfile,  const SWein* meineweine, int &anz); 
    int fileSave(char* strfile, SWein* meineweine, int anz); 
    int fkt_taste(); 
    
    // Hauptprogramm 
    int main() 
    
    {  //Statischer Speicher fuer MAXWEINE 
       struct SWein sammlung[MAXWEINE]; 
       int aktAnz = 0, auswahl; 
    
       //Daten aus Datei einlesen 
       fileRead("weindaten.dat",sammlung,aktAnz);
    

    Kann mir einer einen Tip geben?

    Gruss Tinile



  • tinile schrieb:

    Die Funktion Anzeigen findet nichts.

    Du meinst wenn man auf Anzeigen im Hauptmenü "klickt"?? Bei mir klappt das und die Weine werden angezeigt.

    mfg.



  • Salü joomoo

    Auch wenn du das Programm schliest und wieder startest??

    Die Daten werden schon in der Datei gespeichert(weindaten.dat).Aber beim Neustart findet er sie nicht.

    Könnte es an meinem compiler liegen?

    Gruss tinile
    😕 😕



  • tinile schrieb:

    Salü joomoo

    Auch wenn du das Programm schliest und wieder startest??

    Die Daten werden schon in der Datei gespeichert(weindaten.dat).Aber beim Neustart findet er sie nicht.

    Könnte es an meinem compiler liegen?

    Gruss tinile
    😕 😕

    Stimmt, bei mir werden die daten auch nicht richtig gelesen.

    Folgende Zeile:

    anz = dat_ein.gcount() / sizeof(struct SWein);
    

    gcount() gibt dir nicht die größe der Datei, sondern wieviel Bytes du mit dem letztem input gelsesen hast. Also musst die anz Variable am besten auch noch in der Datei speichern.

    mfg.



  • Salü

    Hab endeckt das ich zum teil anz mit aktAnz verwechselt habe.

    Wie und wo füge ich das anz in die Datei an???

    Danke und Gruss Tinile



  • Vielleicht mit einem Code?



  • tinile schrieb:

    Salü

    Hab endeckt das ich zum teil anz mit aktAnz verwechselt habe.

    Wie und wo füge ich das anz in die Datei an???

    Danke und Gruss Tinile

    Die ersten vier byte sollten die int Variable speichern. Danach folgt die Struktur.

    mfg.



  • Hallo

    Die ersten vier byte sollten die int Variable speichern. Danach folgt die Struktur.
    

    Vertsteh irgendwie nur Bahnhof.

    Wenn ich das anz dem dat_ein.gcount() zuweise?

    Kannst du mir ein beispiel zeigen?

    Gruss tinile



  • Du musst die Variable aktAnz speichern.
    Das sieht dann so aus in der Funktion fileSave:

    dat_aus.write(reinterpret_cast<char*>(&anz),sizeof(int));
    

    Danach schreibst du die Struktur.
    Beim einlesen (fileRead) liest du dann auch zuerst einen int ein:

    dat_ein.read(reinterpret_cast<char*>(&anz),sizeof(int));
    

    Und danach die Struktur.

    Klappt bei mir dann einwandfrei.

    mfg.



  • Vielen Dank joomoo

    Habe den Code eingefügt.Beim Test zeigt er mir aber zahlen (binär?).
    Hat es bei Dir alles richtig angezeigt?
    Muss ich den Code "anz = dat_ein.gcount() / sizeof(struct SWein);" vielleicht
    entfernen?
    Vielleicht habe ich ihn falsch eingefügt.

    //Hilfsfunktionen
    //fileRead liest Datei ein und alloziert dynamisch Speicher fuer alle Elemente und liest Sie ein
    int fileRead(char* strfile, const SWein* meineweine, int &anz){
    
    	//Inputfilestream - Objekt, quasi Pointer auf die Dateien
    	ifstream dat_ein;
      	//Eingabedatei oeffnen
      	dat_ein.open( strfile, ios::in||ios::binary);
       //Check ob's funktioniert hat
      	if (!dat_ein){
       	cerr << "Datei konnte nicht geoeffnet werden!\n";
        	return 1;
       }
       //1. Anzahl Elemente in Datei zaehlen
       anz = dat_ein.gcount() / sizeof(struct SWein);
       dat_ein.read( reinterpret_cast<char*>(&anz),sizeof(int));
    
      	//Strukturen einlesen
       for(int i = 0; i < anz; i++){
       	 dat_ein.read((char *) &meineweine[i],sizeof(struct SWein));
       }
     	//File unbedingt schliessen nach Gebrauch
      	dat_ein.close();
    	return 0;
    


  • Hast du es auch in der fileSave eingefügt?

    Bei mir hat's geklappt. Versuch mal vorher die alte Datei (weindaten.dat) zu löschen.

    Die alte Zeile ist sinnlos, nimm sie am besten raus, aber das sollte nicht das Problem sein.

    mfg.



  • Vielen Dank

    Jetzt klappt es.Du hast mir dabei sehr geholfen.

    Wieder ein Problem weniger.
    Jetzt gehts an die Schuchfunktion im wein Aendern.Hab sie ein wenig umgebaut.Zwar nicht sehr fachmänisch aber sie geht halbwegs.
    Es gibt nur ein Problem.Wenn ich den Wein mit der Nummer 2 suche zeigt er mir den Wein Nummer 3 an.

    void weinAendern(SWein sammlung[], int aktAnz)
    {
       clrscr();
       char x;
       int i;
          for(i = 0; i < aktAnz; i++)
          {
          cout<<"Bitte gesuchte SWeinnummer eingeben: ";
          cin >> i;
          if(sammlung[i].wnr==i);
          {
          cout << "SWeinnummer:\t\t" << sammlung[i].wnr <<"\n";
          cout << "Art:\t\t\t" << sammlung[i].art <<"\n";
          cout << "Name:\t\t\t" << sammlung[i].name <<"\n";
          cout << "Jahrgang:\t\t" << sammlung[i].jahrgang <<"\n";
          cout << "Herkunftsland:\t\t" << sammlung[i].herkunftsland <<"\n";
          cout << "Einlagerungsdatum:\t" << sammlung[i].datum.tag << "." << sammlung[i].datum.monat
               << "." << sammlung[i].datum.jahr <<"\n";
    	   cout << "Preis:\t\t\t" << sammlung[i].preis << "\n";
          cout<<"--------------------------------------------------\n";
          cout << "Vorhandene Stueckzahl:\t" << sammlung[i].stueckzahl<<"\n\n";
          cout << "Wollen Sie den Lagerstand veraendern? Ja/Nein: ";
          cin  >> x;
          if(x=='j')
          {
          cout << "Alter Lagerstand: " << sammlung[i].stueckzahl<<endl;
          cout << "Neuer Lagerstand eingeben: ";
          cin >> sammlung[i].stueckzahl;
          cout << "Neuer Lagerstand: " << sammlung[i].stueckzahl<<endl;
          }
          cout << "Wollen Sie weiter suchen? Ja/Nein: ";
          cin >> x;
          }while(x != 'n');
          cout << "\nWeiter mit beliebiger Taste...";
          }
          getch();
          clrscr();
          return;
    }
    

    Habt ihr vielleicht einen Tip zum Löschen eines ganze Weineintrages?
    Wird eher nicht gehen.Vermutlich nur überschreiben.
    Gibt es eine Möglichkeit dem Wein automatisch eine Nummer zu geben??

    😃 😃 😕 😕


Log in to reply