Вы видите разницу между «текстовым» и «двоичным» файлом. Когда файл открывается в текстовом режиме (без 'b' во втором аргументе fopen), библиотека stdio может (действительно, должна) интерпретировать содержимое файла в соответствии с соглашениями операционной системы для текстовых файлов. Например, в Windows строка заканчивается на \ r \ n, и это переводится в одиночку \ n с помощью stdio, поскольку это соглашение на языке Си. При записи в текстовый файл один \ n выводится как \ r \ n.
Это облегчает написание переносимых программ на Си, которые обрабатывают текстовые файлы. Однако некоторые детали усложняются, и одним из них является fseeking. Из-за этого стандарт C определяет fseek в текстовых файлах только в нескольких случаях: в самом начале, в самом конце, в текущей позиции и в предыдущей позиции, которая была найдена с помощью ftell. Другими словами, вы не можете вычислить местоположение для поиска текстовых файлов. Или вы можете, но вы должны позаботиться обо всех деталях платформы самостоятельно.
Кроме того, вы можете использовать двоичные файлы и самостоятельно выполнять преобразования конца строки. Опять переносимость страдает.
В вашем случае, если вы просто хотите вернуться туда, где вы в последний раз выполняли fscancf, проще всего было бы использовать ftell непосредственно перед тем, как вы fscanf.