Datei auslesen



  • 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??

    😃 😃 😕 😕



  • tinile schrieb:

    Habt ihr vielleicht einen Tip zum Löschen eines ganze Weineintrages?

    Folgendermaßen:
    - 4 einträge
    - nr. 2 wird gelöscht
    - anz wird um eins reduziert
    - nr. 3 rückt an platzt von 2 und nr. 4 rückt an platzt von nr.3 <<-- Das ganze dann mit einer Schleife.

    Gibt es eine Möglichkeit dem Wein automatisch eine Nummer zu geben??

    Auch mit einer Schleife:

    - int i = 0;
    - Überprüfe i:
    * Gibt es bereits einen Wein mit der Nr. i?
    ~ Nein? -> Dann gebe diesem wein die Nummer.
    ~ Ja? -> Dann überprüfe i+1

    mfg.


Anmelden zum Antworten