2012-05-18 4 views
5

Ich bekomme einen sehr seltsamen Fehler beim Versuch, von einer einfachen Textdatei mit c fread() Anruf zu lesen.
Ich habe ein sehr einfaches Programm, das Fehler zu zeigen:Warum zeigt ftell() eine falsche Position nach fread()?

int main(int argc ,char ** argv) { 
    FILE* fh = fopen("adult.txt","r"); 
    if(fh==NULL){ 
    printf("error opening file\n"); 
    exit(0); 
    } 

    int s = 1000; 
    printf("cur before=%d\n",ftell(fh)); 
    char* b = malloc (sizeof(char)*s); 
    int k =fread(b,sizeof(char),s,fh); 
    printf("cur after reading %d bytes =%d\n",k,ftell(fh)); 

    return EXIT_SUCCESS; 
} 

Und was ich als Ausgabe erhalten:

cur before=0 
cur after reading 1000 bytes =1007 

Ist das normal? fread gibt die Zahl '1000' zurück, aber der Cursor (mit ftell()) zeigt 1007 und jede Hilfe wird geschätzt.

Antwort

10

Das ist normal.

'\n' kann mit zwei Zeichen dargestellt werden, also gibt es den Skew, den Sie bekommen.

Wenn Sie das nicht möchten, öffnen Sie das finaly im binären Modus.

+0

danke, ich wusste das nicht. Aber ich verstehe nicht, warum die Rückkehr von fread() nicht der Cursorposition entspricht. – ezzakrem

+1

@ezzakrem Weil 'fread' das Ende der Zeile (das zwei Zeichen sein kann) als ein Zeichen interpretiert und es als eins meldet. –

4

Aus der Dokumentation von ftell:

or binary streams, the value returned corresponds to the number of bytes from the beginning of the file. For text streams, the value is not guaranteed to be the exact number of bytes from the beginning of the file, but the value returned can still be used to restore the position indicator to this position using fseek.

Also ja, das ist normal.

+0

danke das hilft! – ezzakrem

1

Let_Me_Be's Antwort ist korrekt. Ich erkläre hier nur, dass das 'End of Line' (EOL) Zeichen vom zugrundeliegenden Betriebssystem abhängig ist. Wenn Sie beispielsweise in Windows eine Datei mit 'r' (oder nicht Binary) öffnen, gibt das Betriebssystem bei jeder Sequenz '\ r \ n' nur '\ n' zurück. Wenn Sie in eine Datei schreiben, die nicht im Binärmodus geöffnet ist, schreibt sie in Windows "\ r \ n", wenn Sie einfach "\ n" schreiben. Für Unix-Systeme gibt es keine solche Übersetzung durch OS getan. Klassische Macs würden '\ r' für das Ende der Zeile verwenden, aber ich denke, jetzt verwenden sie '\ n' für EOL. Ich hoffe, dass das Buzzword von '\ n' (möglicherweise) durch mehrere Zeichen (\ r \ n) dargestellt wird.

+0

danke! das macht es sehr deutlich. – ezzakrem