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;
}