Выводы отличаются, потому что ваш цикл читает два символа из fp
за итерацию.
Например, в первой итерации i
равно 1
, поэтому fseek
устанавливает текущую позицию файла fp
непосредственно перед последним байтом:
...
These are all palindromes
^
Затем printf("%c",fgetc(fp));
читает байт (s
) и выводит его на консоль. Прочитав s
, позиция файла теперь
...
These are all palindromes
^
т.е. мы находимся в конце файла.
Затем fputc(fgetc(fp),fnew);
пытается прочитать другой байт из fp
. Это не удается, и fgetc
возвращает EOF
(отрицательное значение, обычно -1
). Тем не менее, ваш код не подготовлен к этому и слепо рассматривает -1
как код символа. Преобразованный в байт -1
соответствует 255
, который является символьным кодом для ÿ
в кодировке ISO-8859-1. Этот байт записан в ваш файл.
В следующей итерации цикла мы возвращаемся к e
:
...
These are all palindromes
^
Снова цикл читает два символа: e
записывается в консоль, а s
записывается в файл.
Это продолжается в обратном направлении, пока мы не достигнем начала входного файла:
redivider
^
И снова цикл читает два символа: r
записывается в консоль, а e
записывается в файл.
Это завершает цикл. Конечным результатом является то, что ваш выходной файл содержит один символ, который не существует (из попытки чтения после конца входного файла) и никогда не видит первый символ.
Исправление заключается в том, чтобы вызывать fgetc
только один раз за цикл:
while(i < endNum+1)
{
fseek(fp,-i,SEEK_END);
int c = fgetc(fp);
if (c == EOF) {
perror("error reading from mainText.txt");
exit(EXIT_FAILURE);
}
printf("%c", c);
fputc(c, fnew);
i++;
}