2013-07-15 7 views
5

mit Angenommen, wir eine Textdatei namens hi.txt haben, die folgende Zeichenfolge enthält:unerwartete Ausgabe, wenn fseek

AbCdE12345

Let sagen wir diesen Code ausführen:

int main() { 
    FILE *fp; 
    fp = fopen("hi.txt","r"); 
    if(NULL == fp) { return 1; } 
    fseek(fp,-1, SEEK_END); 
    while (ftell(fp) > 0) { 
    printf("%c",fgetc(fp)); 
    fseek(fp,-4, SEEK_CUR); 
    } 
    fclose(fp); 
    return 0; 
} 

Wenn ich diesen Code lief es gedruckt: 3EbCd

Wenn ich versuchte zu erraten, was es drucken würde, dachte ich, dass es 52d sein sollte. Kann mir jemand erklären, was hier passiert ist?

Antwort

15

Es sieht so aus, als ob am Ende der Datei ein nicht druckbares Zeilenendezeichen vorhanden ist. Das wird zuerst gedruckt. Dann wird die Position wiederum zu 3, E und b bewegt. An diesem Punkt schlägt die Neupositionierung um -3 fehl, da der Speicherort -2 wird. Der Dateicursor bleibt dort, wo er war, d.h. bei C, der als nächstes gedruckt wird. Der folgende Versuch der Neupositionierung schlägt ebenfalls fehl, sodass d gedruckt wird. Die nächste Neupositionierung ist erfolgreich und beendet die Schleife.

Situationen zu erkennen, wenn fseek ignoriert wird, überprüfen Sie den Rückgabewert, wie folgt aus:

while (ftell(fp) > 0) { 
    printf("%c",fgetc(fp)); 
    // Successful calls of fseek return zero 
    if (fseek(fp,-4, SEEK_CUR)) { 
     // Exit the loop if you can't jump back by 4 positions 
     break; 
    } 
} 
+0

Es funktioniert !! Vielen Dank !!! – Robert777

4

Für Dateien im Textmodus geöffnet die weitergegeben fseek Offset von ftell für Werte zurückgegeben nur dann sinnvoll ist. Der Offset muss also nicht unbedingt in Bytes sein. Öffnen Sie die Datei im Binärmodus:

und sehen, ob die Ergebnisse unterschiedlich sind.

Verwandte Themen