ftell возвращает 11 вместо 10

#c #file-pointer

#c #указатель на файл

Вопрос:

У меня есть файл test.txt , который содержит две строки.

 123456789
abcdefghi
  

И вот C-код.

 FILE* fp;
char str[20];
fp = fopen("test.txt", "r");
printf("%d", ftell(fp));                       // 0
printf("%s", fgets(str, sizeof(str), fp));     // 123456789n
printf("%d", ftell(fp));                       // 11
  

Я был смущен, почему в строке 10 символов ( "123456789n" ), но позиция увеличивается на 11.

[отредактировано]

Спасибо за комментарии. Но я не знал, как обновить то, что я уточнил, в правильном формате. Я отмечаю, что я сделал неправильно в этом вопросе здесь.
1. В Windows 'n' хранится как "rn" , поэтому вместо этого возвращает 11.
2. fp = fopen("test.txt", "r") это приведет "rn" к обратному преобразованию в 'n' . Откройте файл в двоичном "rb" формате и fgets должен прочитать "123456789rn" .
3. Я должен использовать %ld строку формата in, поскольку возвращаемый тип ftell is long int .

Комментарии:

1. Почему это помечено как «c «?

2. Вероятно, вы запускаете эту программу в Windows, где новые строки кодируются как два символа: » r n», которые затем преобразуются в » n», как указано стандартом C.

3. В сторону: printf("%d", ftell(fp)); отправляет long значение int спецификатору %d , что является неопределенным поведением .

4. Спасибо за ваш ответ. Я сделал это в Windows. @xing, ты имеешь str в виду, что это "123456789n" вместо "123456789rn" того, когда я «извлекаю это» из файла? Теперь у меня есть еще один вопрос: могу ли я что-то сделать, чтобы код мог работать как в Windows, так и в других ОС? Спасибо!

5. Почему код не будет выполняться на других ОС? И зачем вам нужна эта программа?