fread() richtig benutzen



  • Hallo,
    Meine Frage bezieht sich auf folgenden Programmausschnitt:

    struct {
       float x;
       float y;
       float z;
    }point;
    
    void output(FILE *save){
         struct point points [5];
         int i;
         int count;
         count = fread(points, sizeof(points[0]), 5, save);
         for (i = 0 ; i < count ; i++)
         printf("%f, %f, %f\n", points[i].x, points[i].y, points[i].z);
    }
    

    Bei jedem Lesevorgang liest das Programm bis zu 5 Punkte. In was für eine while Schleife muss ich den Lesevorgang packen damit alle Punkte ausgegeben werden?



  • struct point p;
         int i;
         for (i = 0 ; fread(&p, sizeof p, 1, save) ; i++)
         printf("%d: %f, %f, %f\n", i+1, p.x, p.y, p.z);
    


  • Danke für die Antwort, aber in der Aufgabenstellung steht, dass bei jedem Lesevorgang bis zu 5 Punkte gelesen werden müssen.



  • Lass dir nicht alles aus der Nase ziehen!
    Ich mache also hier deine Hausaufgaben.
    Stelle dich nicht so an und lese wenigstens die Spezifikation zu fread damit der beabsichtigte Lerneffekt deines Lehrers wenigstens ansatzweise erfüllt wird; und while muss es auch unbedingt sein?
    Na dann macht am besten hier jemand anderes weiter, der dazu jetzt noch Lust hat.



  • Ich wollte nicht sofort die Lösung.
    Kann ich so eine while Schleife verwenden?
    fread() gibt mir ja die Anzahl der gelesenen Objekte an, und solange noch etwas zum lesen da ist, ist die Bedingung doch erfüllt?
    Muss die Dateiposition innerhalb der Schleife geändert werden, damit das funktioniert?

    struct {
       float x;
       float y;
       float z;
    }point;
    
    void ausgabe(FILE *save){
         int i;
         int count;
         struct point points[5];
         while(fread(points, sizeof (points[0]), 5, save) > 0 ){
             count = fread(points, sizeof(points[0]), 5, save);
             for (i = 0 ; i < count ; i++)
             printf("%f, %f, %f\n", points[i].x, points[i].y, points[i].z);
    }
    


  • Kann man die Dateiposition so wieder zurücksetzen:

    fseek(save, 0L, SEEK_CUR - 4);
    


  • So hast du zweimal fread in jedem Schleifendurchgang.

    f.riedmann schrieb:

    Muss die Dateiposition innerhalb der Schleife geändert werden, damit das funktioniert?

    Nein. Das wird automatisch gemacht.
    (Was das Problem mit den zweimal fread erklärt)

    Du kannst die Zuweisung an count schon beim while machen.



  • ich meinte natürlich so:
    [code]fseek(save, -4L, SEEK_CUR);



  • Die Frage mit der Dateiposition war auf das zweimal fread() bezogen.



  • while((count = fread(points, sizeof (points[0]), 5, save)) > 0 ){
    

    und du brauchst kein fseek oder so.



  • Ok, danke für die Hilfe!


Anmelden zum Antworten