Quando foi feito
fseek (f, 0, SEEK_SET);
o programa sobrescreveu o primeiro caractere, pois, segundo o professor, SEEK_SET seleciona o primeiro byte do arquivo como início. Mas, quando foi feito
fseek (f, 0, SEEK_END);
o programa não sobrescreveu o último caractere, ele o pulou e a partir daí começou a escrever. Por que? O programa não deveria ter apagado o último caractere da última palavra e a partir daí ter escrito
"\n%s"
?