Leggere un file al contrario in C
La lettura di un file in C avviene in maniera unidirezionale, dall’inizio alla fine. Per leggere un file al contrario, è necessario utilizzare la funzione di posizionamento fseek:
int fseek ( FILE * stream, long int offset, int origin );
dove stream è un puntatore ad un oggetto FILE, offset è l’offset, in byte, da origin.
origin è un intero che rappresenta la posizione. E’ possibile utilizzare le seguenti tre costanti:
SEEK_SET | Inizio del file |
SEEK_END | Fine del file |
SEEK_CUR | Posizione corrente |
Il valore di ritorno della funzione è 0 se ha avuto successo, un valore non nullo altrimenti.
L’idea che sta alla base del codice che segue è quella di posizionarci sull’ultimo byte. Successivamente, in un ciclo, leggiamo un byte (il cursore del file si sposta in avanti di un byte) e torniamo indietro di due byte (saltiamo cioè il byte appena letto e ci posizioniamo sul byte da leggere).
#include <stdio.h> int main(int argc, char** argv) { FILE* fd; char* filename; char c; filename = "test.txt"; if( (fd = fopen(filename, "r")) == NULL) return 2; fseek(fd, -1, SEEK_END); do { printf("%c", (char)fgetc(fd)); } while(fseek(fd, -2, SEEK_CUR) == 0); printf("\n"); fclose(fd); return 0; }