#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. Почему код не будет выполняться на других ОС? И зачем вам нужна эта программа?