Dateiausgabe zu lang?



  • Ich sitze jetzt seit Stunden hier und versuche, ein paar Daten in eine Datei zu schreiben, aber das Progamm schreibt grundsätzlich ein Byte zu viel. Wahrscheinlich ist es ein ganz dummer Fehler, den jeder (ausser mir) auf den ersten Blick sieht, aber ich komm um's verrecken nicht drauf. Folgender Code erstellt eine Datei, die eigentlich 1040 Bytes gross sein sollte. Aus unerfindlichen Gründen sind es aber jedes mal 1041.

    [cpp]#include <stdio.h>

    #define FOOFS_SUPERBLOCK_VALID 1

    struct foofs_superblock_t {
    char stamp[6];
    unsigned short flags;
    unsigned long long empty_inode;
    unsigned long long full_inode;
    unsigned long long empty_block;
    unsigned long long full_block;
    unsigned long long inodes;
    unsigned long long blocks;
    char reserved[984];
    };

    void mkFooFS(FILE* file, unsigned long long inodes) {
    int i;
    unsigned char* s;
    struct foofs_superblock_t superblock;
    strcpy(superblock.stamp, "FooFS");
    superblock.flags = FOOFS_SUPERBLOCK_VALID;
    superblock.empty_inode = 2;
    superblock.full_inode = 0;
    superblock.empty_block = (inodes / 2) - 1;
    superblock.full_block = 0;
    superblock.inodes = inodes;
    superblock.blocks = inodes * 512;
    s = (unsigned char*)&superblock;
    for(i = 0; i < 1040; ++i)
    fputc((int)s[i], file);
    }

    int main() {
    FILE* file = fopen("rootfs", "w+");
    mkFooFS(file, 100);
    fclose(file);
    return 0;
    }[/cpp]



  • wieso "puttest" du bitte schön einen int in die file??? is doch klar, dass das am ende immer eins mehr ist. zwischendurch wird das zweite byte von dem einen schreib-vorgang mit dem 1. byte vom nächsten schreibdurchgang ersetzt. also das könnte es sein. (glaub ich aber irgendwie doch nicht, weil putc ja ein byte puttet)

    löschst du die datei jedesmal bevor du es nochmal probierst? kann sein, dass die noch so groß ist, weil du den fehler mal drinne hattest, das letzte byte aber nie gelöscht wurde

    cu todo



  • könnte es daran liegen das C immer am ende einer Ausgabe ein [newline] setzt? Das ist in der ASCII tabelle als ein Byte zu lesen?



  • Öffne die Datei mal im Binärmodus ("w+b").



  • wieso "puttest" du bitte schön einen int in die file???

    Weil putc() einen int will:
    int fputc(int c, FILE *stream);

    löschst du die datei jedesmal bevor du es nochmal probierst?

    ja

    kann sein, dass die noch so groß ist, weil du den fehler mal drinne hattest, das letzte byte aber nie gelöscht wurde

    Wenn ich die Datei als w+ öffne, sollte der Inhalt doch dabei gelöscht werden, oder?

    könnte es daran liegen das C immer am ende einer Ausgabe ein [newline] setzt?

    Echt? Das wäre mir noch nie aufgefallen... Wie dem auch sein, das letzte Byte ist 0xFF, das mit dem Newline fällt also flach.

    Öffne die Datei mal im Binärmodus ("w+b").

    Jaaaa! Danke!! Jetzt geht es. (Ich dachte immer, es macht bei neueren Betriebessystemen keinen Unterschied mehr, ob w+ oder w+b...? 😕 )

    [ Dieser Beitrag wurde am 10.06.2003 um 13:26 Uhr von UncleSniper editiert. ]



  • ne, es macht nur auf Betriebssystemen keinen Unterschied wo Text- und Binaermodus gleichbehandelt werden, wie zB unter Unix

    Unter Windows gibts da nen Unterschied:
    zB: \n wird als \r\n dargestellt.



  • ist mir gerade eingefallen:

    warum schreibst du eigentlich nicht mit fwrite() in die datei??



  • Ja, wie Shade schon gemeint hat, liegt es sicher an der \r\n-"Regel" von gewissen Betriebssystemen 😃
    Nur mal ne fixe Frage dazu: mich hat schon von Anfang an der Gedanke gewurmt - WARUM wird in diesen gewissen OS' zwischen Text- und Binärmodus unterschieden?! Das bringt doch nicht wirklich viele VOrteile, oder? Ich kann mir bis heute auf diese Differenzierung keinen Reim machen 🙄

    Und nein: du solltest kein fputc() benutzen, um Binärdaten zu schreiben. Ein Aufruf

    fwrite(&superblock, sizeof(struct foofs_superblock_t), 1, file);
    

    dürfte sein Werk gut verrichten, lesen kannst du das Ganze dann mit

    fread(&superblock, sizeof(struct foofs_superblock_t), 1, file);
    

    [ Dieser Beitrag wurde am 10.06.2003 um 23:13 Uhr von RTC editiert. ]


Anmelden zum Antworten