2016-11-28 2 views
2

Ich bin ein großer Puffer für die FILE* Objekt (Größe von 8 * 1024) und ich mache einen Schreibvorgang von 4 Bytes, und dann lese ich von der 4, aber die Lesen fehlgeschlagen. Wenn ich die FILE* lösche, ist der Lesevorgang erfolgreich.fread() nach fwrite() bekommt 0 Bytes

typedef struct _MyFile {     /* file descriptor */ 
    unsigned char fileBuf[8*1024]; 
    FILE *file; 
} MyFile; 

int main() { 
    MyFile myFile; 
    int res; 
    char bufWrite[4] = { 1, 2, 3, 4 }; 
    char bufRead[4]; 

    /* Open file for both reading and writing */ 
    myFile.file = fopen("myfile.txt", "w"); 

    /* Change the file internal buffer size */ 
    setvbuf(myFile.file, myFile.fileBuf, _IOFBF, sizeof(myFile.fileBuf)); 

    /* Write data to the file */ 
    res = (int)fwrite(buf, 1, 4, myFile.file); 
    printf("write: res = %d\n", res); 

    /* Seek to the beginning of the file */ 
    fseek(fp, SEEK_SET, 0); 

    /* Read and display data */ 
    res = (int)fread(buf, 1, 4, myFile.file); 
    printf("read: res = %d\n", res); 
    fclose(myFile.file); 

    return 0;   
} 

Die Ausgabe lautet:

write: res = 4 
read: res = 0 

Wenn ich mehr als 8K schreiben oder write() statt fwrite() die fread() funktioniert gut verwenden.

Die Sache ist, ich kann nicht verwenden fflush() !!!

Gibt es eine Möglichkeit, es zu beheben?

+1

haben Sie versucht, Ihre Datei im Lese-/Schreibmodus zu öffnen? 'fopen (" myfile.txt "," rw ");' –

+0

Kann man nicht ungepufferte Anrufe ('open',' read', 'write') benutzen? –

+0

@Eliand fopen ("myfile.txt", "w +"); sollte den Trick machen .. –

Antwort

2

Sie haben Ihre Datei im schreibgeschützten Modus geöffnet. Dem Handle ist nicht bewusst, dass Sie darauf lesen möchten.

Öffnen Sie einfach Ihre Datei im Lese-Schreib-Modus:

myFile.file = fopen("myfile.txt" , "w+"); 

Ich habe es getestet und es liest die Daten erfolgreich in den Lesepuffer zurück.

Schreibmodus nur:

write : res = 4 
read: res = 0 
bufRead: -83 20 82 117 

Lese-/Schreibmodus:

write : res = 4 
read: res = 4 
bufRead: 1 2 3 4 

Edit: mein erster Versuch Verwendung "rw" Modus, arbeitete aber gab seltsame Rückgabewert Ergebnis schreiben:

write : res = 0 
read: res = 4 
bufRead: 1 2 3 4 
Verwandte Themen