Ха!! Как бы мне выразить все это в четком вопросе!! Позвольте мне попробовать:
Я знаю, что файлы, открытые с помощью fopen()
, буферизуются в память. Мы используем буфер для эффективности и простоты. Во время чтения из файла содержимое файла сначала считывается в буфер, и мы читаем из этого буфера. при записи в файл содержимое сначала записывается в буфер, а затем в файл.
Но что с fseek()
, fsetpos()
и rewind()
отбрасыванием эффекта предыдущих вызовов ungetc()
? Не могли бы вы рассказать мне, как это делается? Я имею в виду, что мы открыли файл для чтения и он скопирован в буфер. Теперь с помощью ungetc()
мы изменили некоторые символы в буфере. Вот что я просто не могу понять даже после долгих усилий:
Вот что сказано о
ungetc()
--"Вызов fseek, fsetpos или перемотки в потоке отбрасывает все символы, ранее помещенные в него с помощью этой функции." --Как символы, уже помещенные в буфер один из подходов заключается в том, что исходные символы, которые были удалены, «запоминаются», а каждый новый введенный символ идентифицируется и заменяется исходным символом. Но это кажется очень неэффективным. Другой вариант — загрузить копию исходный файл в буфер и поместите указатель файла в предполагаемую позицию. Какой подход из этих двух использует fseek, fsetpos или перемотка, чтобы отбросить символы, введенные с помощьюungetc()
?Для текстовых потоков, как наличие непрочитанных символов в потоке, символы, которые были введены с использованием
ungetc()
, влияют на возвращаемое значениеftell()
? Меня смущает следующая строка оftell()
иungetc()
из этой ссылки оftell
(ИСТОЧНИК)
"Для текстовых потоков числовое значение может не иметь смысла, но его все же можно использовать для восстановления позиции в ту же позицию позже с помощью fseek (если есть символы, возвращенные с помощью ungetc, которые все еще ожидают чтения, поведение не определено)."
- Сосредоточившись на последней строке вышеприведенного абзаца, какое отношение
pending of being read
имеет к отбрасыванию полученного "ungetc()" символа? Каждый раз, когда мы читаем символ, который был помещен в поток с помощьюungetc()
, он отбрасывается после чтения?