Brauche dringend HILFE!!!



  • SlotRacer schrieb:

    Inhalt der VERTRAG.DAT
    Inhalt:
    EAN: 512621
    Beteichnung: Schokorosinen
    Lieferant: Waldbaur
    Bestand: 300
    Liefermenge: 200

    EAN: 512622
    Beteichnung: Ritter-Rum
    Lieferant: Ritter
    Bestand: 280
    Liefermenge: 290

    ...

    es schaut aber so aus wie in meinem letzten post, ich war schon drauf und dran das teil zeilenweise inzulesen...

    hab das gerade gefunden, das hatte nwp2 mal in nem anderen post gepostet

    nwp2 schrieb:

    char *readFile(const char *filename){
        //code heavily changed from http://www.cplusplus.com/reference/clibrary/cstdio/fread/
        FILE *file = fopen(filename, "rb");
        if (!file) return 0;
        //get file size
        fseek(file, 0, SEEK_END);
        size_t filesize = ftell(file); //files >4GB?
        rewind(file);
        //get memory to contain the whole file
        char *buffer = (char*)malloc(filesize+1);
        if (!buffer) return 0;
        //read file
        if (fread(buffer, 1, filesize+1, file)!=filesize){
            free(buffer);
            fclose(file);
            return 0;
        }
        //clean up
        fclose(file);
        buffer[filesize] = '\0';
        return buffer;
    }
    

    evtl. kannst das ja brauchen 😉



  • Also bin jetzt bis hierhin gekommen:

    #include <stdio.h>
    
    struct vertrag                                  //Einlesen der Struktur
           {
               char vertrnr[7];
               char art[21];
               char liiferant[21];
               unsigned short vertagsmenge;
               unsigned short liefertermin[3];
               unsigned short liefermenge;
           }__attribute__((packed))vertrag;
    
    int main(int argc, char *argv[])
    {
        char Auswahl;
        int i;
        i=1; 
    
        FILE*Dateiptr;
    
        char *datei_auswahl= "vertrag.dat";
    
        if (!(Dateiptr = fopen(datei_auswahl,"rb")))
        {
           printf("Beim oeffnen der Datei %s ist ein Fehler aufgetreten.\n", datei_auswahl);
           getch();
        }
        else
            while (fread(&vertrag, sizeof(vertrag),1, Dateiptr) == 1)
            {
                  printf("Dateinummer: %d\n",i++);
                  printf("\nEAN: \t\t%s",vertrag.vertrnr);
                  printf("\nBezeichnung: \t%s",vertrag.art);
                  printf("\nLieferant: \t%s",vertrag.liiferant);
                  printf("\nBestand: \t%d",vertrag.vertagsmenge);
                  printf("\nLiefermenge: \t%d\n\n",vertrag.liefermenge);
                  getch();
            }
    
        getch();
        return(0);
    };
    

    Jetzt muss ich die folgenden Aufgaben lösen:
    - die Namen aller Hauptlieferanten (Vertragsmenge im Bsp. > 500)
    - alle Angaben zu Verträgen mit einem Lieferanten, vom Nutzer aus einer
    alphabetisch sortierten Liste aller Lieferanten zu wählen, geordnet nach Artikeln
    und unter Auflistung der Gesamtvertragsmenge bei Mehrfachlieferung eines
    Artikels,
    - die Namen aller Lieferanten bei denen bis zu einem, vom Nutzer einzugebenden
    Termin keine Abweichungen zwischen Vertrags- und Liefermenge auftraten.



  • was soll denn das denke das muß raus?

    __attribute__((packed))
    

    😕

    int main(void){
      ...
      i=1;
      //statt
      i=0;
      ...
      struct vertrag dataCache[1024] = {};
      ...
      while (fread(&dataCache[i], sizeof(vertrag),1, Dateiptr) == 1)
            {
                  printf("Dateinummer: %d\n",i);
                  printf("\nEAN: \t\t%s",dataCache[i].vertrnr);
                  printf("\nBezeichnung: \t%s",dataCache[i].art);
                  printf("\nLieferant: \t%s",dataCache[i].liiferant);
                  printf("\nBestand: \t%d",dataCache[i].vertagsmenge);
                  printf("\nLiefermenge: \t%d\n\n",dataCache[i].liefermenge);
                  getch();//hm wieso machst am besten alles raus??
                  i++;
            } 
    ...
    }
    

    dann ist alles schon mal im array 😉



  • Das packed attribut sorgt IIRC dafür, dass keine leeren füllbytes in dem Struct eingefügt werden.



  • grundsätzlich haste 2 möglichkeiten: (1) alle structs in den speicher einlesen. (2) direkt mit der datei arbeiten. ich würde 2. nehmen, aber da musste beim sortieren mehr tricksen (eine liste von offsets für fseek müsste sortiert werden). für'n anfänger ist 1. wohl einfacher zu machen. lade dir erstmal die ganze datei in ein array (du weisst ja wie gross sie ist, malloc brauchste also nicht *fg*) und dann versuch mal darin zu navigieren.
    etwa so:

    struct vertrag alles[...];
    struct vetrag *der_vertrag;
    ...
    FILE *f = fopen (filename, "rb");
    if (f)
    {
       fread (alles, 1, dateigroesse, f);
    }
    ...
    der_vertrag = alles; // zeigt auf 1. vertrag
    ...
    der_vertrag++; // vertrag 2
    ...
    der_vertrag++; // vertrag 3
    
    ... // usw.
    

    ^^wichtig ist noch, dass du das structs-array mit den gleichen settings einliest, mit denen es gespeichert wurde (packed oder nicht usw, am besten mit dem gleichen compiler)
    🙂



  • Hallöchen. Ich habs jetzt so gemacht.

    #include <stdio.h>
    
    struct vertrag                                  //Einlesen der Struktur
           {
               char vertrnr[7];
               char art[21];
               char liiferant[21];
               unsigned short vertagsmenge;
               unsigned short liefertermin[3];
               unsigned short liefermenge;
           }__attribute__((packed))vertrag;
    
    int main(int argc, char *argv[])
    {
        char Auswahl;
        int i;
        i=1; 
    
        FILE*Dateiptr;
    
        char *datei_auswahl= "vertrag.dat";
    
        printf("\n\t===============================\n");
        printf("\t=== Weihnachtsaufgabe Nr.44 ===\n");
        printf("\t===============================\n\n");
    
        if (!(Dateiptr = fopen(datei_auswahl,"rb")))
        {
           printf("Beim oeffnen der Datei %s ist ein Fehler aufgetreten.\n", datei_auswahl);
           getch();
        }
        else
        {
            printf("Menue:\n");
            printf("\tNamen aller Hauptlieferanten: (1)\n");
            printf("\tBeenden: (4)\n");
            printf("\tAuswahl:");
    
        }
    
        putch(Auswahl = getch());
    
        switch (atoi(&Auswahl))
        {
               case 1:printf("\n\n\n\tName aller Hauptlieferanten:\n\n");
               while (fread(&vertrag, sizeof(vertrag),1, Dateiptr) == 1)
               {
                     if (vertrag.vertagsmenge>500)
                     {
                        printf("\tName: %s\n\t",vertrag.liiferant);
                     }
               }
               break;
        }
    
        getch();
        return(0);
    };
    

    Wie kann ich das am besten machen das der Lieferant nur einmal austaucht auch wenn er mehrere Artikel mit einer menge >500 hat??? Jetzt taucht ein Lieferant mehrfach auf.

    Desweiteren hab ich jetzt Probleme mit den anderern beiden aufgabenstellungen. Da hab gar keine idee wie ich das machen soll.



  • 2 möglichkeiten entweder du merkst dir welchen du schon hattest oder du sortierst nach namen und menge und dann schaust ob der name = nächster name ist oder so...



  • Okay danke ich gaub das ist das kleinste übel. Mir fällt allerdings keine Lösung für die beiden anderen Aufgabenstellungen ein. Kann mir jemand helfen?

    BITTE!!!



  • SlotRacer schrieb:

    Mir fällt allerdings keine Lösung für die beiden anderen Aufgabenstellungen ein.

    Und die wären...?
    😕
    Stehen die vielleicht in dem rar-Ding, von dem kaum jemand weiß, wie man das entpacken soll?



  • SlotRacer schrieb:

    Jetzt muss ich die folgenden Aufgaben lösen:
    - die Namen aller Hauptlieferanten (Vertragsmenge im Bsp. > 500)
    - alle Angaben zu Verträgen mit einem Lieferanten, vom Nutzer aus einer
    alphabetisch sortierten Liste aller Lieferanten zu wählen, geordnet nach Artikeln
    und unter Auflistung der Gesamtvertragsmenge bei Mehrfachlieferung eines
    Artikels,
    - die Namen aller Lieferanten bei denen bis zu einem, vom Nutzer einzugebenden
    Termin keine Abweichungen zwischen Vertrags- und Liefermenge auftraten.

    😉



  • ja genau...

    danke @noobLolo

    Ich bin hier am verzweifeln....Ich bekomm das einfach nicht gebacken



  • Du brauchst ne Funktion, die dir alle Einträge aus der Datei einliest und in Strukturen speichert.
    Du brauchst ne Liste mit den Unikaten der Lieferanten für die Anzeige und für die Auswahl, die erstellst du aus den eingelesenen Einträgen.
    Dann gehts weiter 🙂



  • Ja da ist ja das Problem. Ich weiß nicht wirklich wie ich das machen soll.....Ach das ist alles zum k***** hier.

    Ach mann. Seit mittlerweile 5 Stunden sitz ich an dem Ding.



  • ich denke der trick ist einfach das richtig zu sortieren dann wirds um einiges einfacher, zeig doch mal was du bis jetzt hast



  • Naja ich bin immernoch so weit wie vor 2 Stunden (hab das weiter oben schonmal gepostet).... Und das ärgert mich ja so dolle.



  • das ist natürlich schlecht, hast schonmal versucht da ein bischen sortieren einzubauen?



  • nee weiß nicht genau wie ich das machen soll...Irgendwie ist grad die Luft ein bißchen raus.



  • die Lust oder Luft 😃 ?
    sag mal für was für nen schul typ ist das eigentlich?



  • SlotRacer schrieb:

    printf("\n\t===============================\n");
    printf("\t=== Weihnachtsaufgabe Nr.44 ===\n");
    printf("\t===============================\n\n");

    Schau mal in Aufgabe 1 bis 43. Vielleicht muß nur was geringfügig angepasst werden?



  • bekommen wir die dann auch 😃


Anmelden zum Antworten