For the record, I see this as something merely funny and with no real application, yet it manages to do so using fseek
and ftell
.
Start by positioning yourself at the end with fseek
and with ftell
discovers the position of this end. Then decreases the position manually and uses again fseek
to read from that byte:
int main(){
FILE *arq = fopen("teste.txt","r");
fseek(arq, 0, SEEK_END); //ir para o fim do arquivo
long posicao = ftell(arq); //assumir a posição como fim
char ch;
while(posicao >= 0){
fseek(arq, posicao, SEEK_SET); //reposicionar de acordo com a posicao
fread(&ch, sizeof(char), 1, arq); //ler o caratere
printf("%c\n",ch);
posicao--; //andar uma posição para trás
}
return 0;
}
The instruction in focus is:
fseek(arq, posicao, SEEK_SET); // arquivo, offset, tipo de posicionamento
SEEK_SET
means positioning at the beginning. In this case it will be positioned posicao
bytes from the beginning. How posicao
decreases with 1
in 1
in the while
, is positioning itself more and more towards the beginning.
A more performative solution involves reading the entire file (from start to finish) to a char[]
and then use this array backwards, which avoids having to do multiple fseek
s.