2012-05-18 12 views
5

Si verifica un errore molto strano durante il tentativo di leggere da un semplice file di testo con la chiamata c fread().
Ho fatto un programma molto semplice per dimostrare che l'errore:Perché ftell() mostra una posizione errata dopo 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; 
} 

E che cosa ottengo come output:

cur before=0 
cur after reading 1000 bytes =1007 

È normale? riporta il numero '1000' ma il cursore (con ftell()) mostra 1007 e qualsiasi aiuto sarà apprezzato.

risposta

10

Questo è normale.

'\n' può essere rappresentato con due caratteri, quindi c'è l'inclinazione che si ottiene.

Se non si desidera che ciò accada, aprire definitivamente in modalità binaria.

+0

grazie, non lo sapevo. Ma non capisco perché il ritorno di fread() non è lo stesso della posizione del cursore? – ezzakrem

+1

@ezzakrem Perché 'fread' interpreterà la fine della riga (che può essere di due caratteri) come un carattere, e lo segnalerà come uno. –

4

Dalla documentazione di 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.

Quindi sì, questo è normale.

+0

grazie che aiuta! – ezzakrem

1

La risposta di Let_Me_Be è corretta. Sto solo spiegando qui che il carattere "End of Line" (EOL) dipende dal sistema operativo sottostante. Ad esempio, in Windows se apri un file con 'r' (o non binario) allora ogni volta che c'è una sequenza di '\ r \ n' il sistema operativo restituirà solo '\ n'. Allo stesso modo, quando scrivi in ​​un file che non è aperto in modalità binaria, in Windows scriverà '\ r \ n' quando scrivi semplicemente '\ n'. Per i sistemi Unix non esiste una tale traduzione per OS. I Mac classici useranno "\ r" come carattere di fine riga, ma penso che ora usino '\ n' per EOL. Spero che cancelli la parola d'ordine di '\ n' per essere rappresentato (possibilmente) da più caratteri (\ r \ n).

+0

grazie! questo lo rende molto chiaro. – ezzakrem

Problemi correlati