Structur in Bin Datei schreiben und auslesen



  • Hallo Forum,

    wir haben die Aufgabe, 5 Datensätze einlesen zu lassen und diese in eine Binärdatei zu speichern, diese dann zu schließen, neu zu öffnen und den 2ten und 5ten Datensatz am Bildschirm anzeigen zu lassen.

    Mein Code sollte eigentlich soweit funktionieren, macht aber nicht mehr weiter, nachdem man die 5 Datensätze eingegeben hat (Fehlermeldungen kommen aber keine, er führt die fseek und fread Befehle unten im Programm nicht aus bzw es wird nicht im stdout also im Konsolenfenster angezeigt.

    Vielleicht hat jemand eine Idee, wieso?

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <math.h>
    
    struct datensatz
        {
            int anzahl;
            char artikelbezeichnung [40];
            int artikelnummer;
            float preis;
        }datensaetze;
    
    int main()
    {
    	int i;
        FILE *dateizeiger=fopen("C:/Users/Username/Informatik/Praktikum/lagerhaltung.bin","wb+");//öffnen der Datei im Binärmodus mit schreibrechten um Datensätze einzugeben
        if(dateizeiger==0){printf("Fehler beim oeffnen der Datei!\n");return 0;}
    
        for(i=0;i<5;i++)
    	{
        printf("Bitte geben Sie 5 Datensaetze zur Inventur ein: \n");        //Einlesen eines Datensatzes
        printf("Artikelbezeichnung: \n");
        fgets(datensaetze.artikelbezeichnung,40,stdin);
        printf("Artikelnummer : ");
        do 
        {
          scanf("%i",&datensaetze.artikelnummer);
        } while(getchar()!= '\n');
        printf("Anzahl des Artikel im Lager: \n");
        do
        {
            scanf("%i",&datensaetze.anzahl);
        } while(getchar()!='\n');
        printf("Preis des Artikels: \n");
        scanf("%.2f",&datensaetze.preis);                                   //Einlesen eines Datensatzes ENDE
    	fflush(stdin);														
    	fwrite(&datensaetze,sizeof(datensaetze),1,dateizeiger);  //reinschreiben des aktuellen Datensatzes in Binärdatei
    	}
    
        fclose(dateizeiger);                                               
    
        dateizeiger=fopen("C:/Users/Username/Informatik/Praktikum/lagerhaltung.bin","rb"); //Erneut öffnen, um zweiten Datensatz auszugeben (jetzt reicht lesezugriff)
        if(dateizeiger==0){printf("Fehler beim oeffnen der Datei!\n");return 0;}
    
        fseek(dateizeiger,sizeof(datensaetze)*1,SEEK_SET);                    //geht an position des zweiten Datensatzes (Größe*1) relativ zum Dateianfang
        fread(stdout,sizeof(datensaetze),1,dateizeiger);
        fseek(dateizeiger,sizeof(datensaetze)*4,SEEK_SET);                    //geht an position des letzten (5ten) Datensatzes (Größe*4) relativ zum Dateianfang
        fread(stdout,sizeof(datensaetze),1,dateizeiger);
    
        fclose(dateizeiger);                                                //Abschließend wird die Datei geschlossen
    
        printf("Fertig!");
        getch();
        return 0;
    }
    


  • Huh, erstmal bitte nicht die code- tags setzen, sondern die für c, bitte, Danke!

    Mal prinzipiell nicht unrichtig, aber das Gegenstück zu fwrite heißt fread.

    Wenn's nur ums sequenzielle Lesen geht, ist das der Anker Deiner Wahl, um nachzulesen. 😉

    Edit: Achso, ja, first glance, bitte Pointer nicht gegen ==0 prüfen, sondern gegen NULL. Ist meist richtig predefined.


  • Mod

    Guck mal deine Zeilen 57 und 59 genauer an.



  • SeppJ schrieb:

    Guck mal deine Zeilen 57 und 59 genauer an.

    was stimmt denn daran nicht? afaik wird mit sizeof(datensaetze),1

    genau eine ganze stuctur von der datei in den stdout stream geschrieben, was man ja im konsolenfenster sehen müsste?



  • Du kannst mit fread in einen Speicherbereich einlesen, nicht auf einen Stream schreiben ...



  • Belli schrieb:

    Du kannst mit fread in einen Speicherbereich einlesen, nicht auf einen Stream schreiben ...

    ok danke, das habe ich falsch verstanden.

    ich habe es nun geändert und bekomme folgenden output, wenn ich bei den 5 datensätzen jeweils nur zahlen von 1-5 eingebe also datensatz 1 ist 1 1 1 1
    datensatz 2 ist 2 2 2 2 und so weiter

    http://www.bilder-upload.eu/show.php?file=fd7e2f-1445361160.jpg

    also diese 2 symbole am Ende

    Kann das stimmen bzw kann man das überhaupt richtig überprüfen? Ich kann die .bin Datei ja nicht anzeigen lassen (geht anscheinend nur über ein kostenpflichtiges Programm für iso dateien?)



  • Nein.
    Der tuts auch: http://www.chip.de/downloads/Tiny-Hexer_13014623.html

    Edit: Was hast Du mit fseek eigentlich vor? War das wirklich Aufgabe, den angehängten Teil wiederzufinden? Meine, sonst sinds einfach soviele freads wie fwrites zuvor.



  • pointercrash() schrieb:

    Nein.
    Der tuts auch: http://www.chip.de/downloads/Tiny-Hexer_13014623.html

    Edit: Was hast Du mit fseek eigentlich vor? War das wirklich Aufgabe, den angehängten Teil wiederzufinden? Meine, sonst sinds einfach soviele freads wie fwrites zuvor.

    Danke für das Programm, ich bin gerade am überprüfen. Die Aufgabe lautet, den 2ten und 5ten Datensatz der 5 eingegebenen Datensätze am Bildschirm (in der Konsole) anzuzeigen, nachdem diese in die Binärdatei geschrieben wurden. Du meinst also man sollte mit den return Werten arbeiten? Dann war das wohl nur zur Übung der fseek Funktion gedacht.

    ich habe hier nochmal den relevanten Code:

    fseek(dateizeiger,sizeof(datensaetze)*1,SEEK_SET);                    //geht an position des zweiten Datensatzes (Größe*1) relativ zum Dateianfang
        fread(ausgabearray,sizeof(datensaetze),1,dateizeiger);
    	printf("%s", ausgabearray);
        fseek(dateizeiger,sizeof(datensaetze)*4,SEEK_SET);                    //geht an position des letzten (5ten) Datensatzes (Größe*4) relativ zum Dateianfang
        fread(ausgabearray,sizeof(datensaetze),1,dateizeiger);
        printf("%s", ausgabearray);
    

    es ist richtig, die fread funktion zu nutzen, um dann in ein char array (ausgabearray) zu schreiben und dieses dann durch %s auszugeben oder?

    normal müsste man ja 0er und 1er bekommen aber das wird anscheinend automatisch in Zeichen umgewandelt



  • %s gibt bei printf eine 0-terminierte char-Folge auf stdout aus (steht alles in der Spezifikation, die du nicht gelesen hast)
    Du hast deine eigene Datenstruktur nicht verstanden.
    Du hast fread (trotz mehrfacher Hinweise) nicht verstanden.
    Deine struct ist kein char[], demzufolge kannst du es nicht wie ein char[] behandeln, da hilft auch kein Cast.

    - fflush(stdin) ist Müll
    - do {} while(getchar()!='\n') ist Müll

    Lerne mit struct umzugehen, bei
    "scanf("%.2f",&datensaetze.preis);"
    hast du das doch schon getan, warum machst du es nicht genauso bei der Ausgabe?
    Du handelst zusammenhanglos und hast keinen Überblick, was du gerade tust.
    Es bringt in C nichts, sich irgendwoher irgendwelche Codesnippets zusammenzugoogeln, die in einem Programm irgendwie zusammenzubauen, die Compilerwarnungen zu ignorieren und dann zu jammern, dass irgendwas nicht funktioniert.
    C ist keine Programmiersprache für Anfänger, sie ist prinzipiell nicht intuitiv.


Log in to reply