Ха!!Как да поставя всичко в ясен въпрос!!Нека опитам:
Знам, че файловете, отворени с помощта на fopen()
, се буферират в паметта. Ние използваме буфер за ефективност и лекота. По време на четене от файла, съдържанието на файла първо се чете в буфера и ние четем от този буфер. По същия начин, при запис във файла, съдържанието се записва първо в буфера и след това във файла.
Но какво ще стане с fseek()
,fsetpos()
и rewind()
отпадане на ефекта от предишните повиквания към ungetc()
? Можете ли да ми кажете как се прави това? Имам предвид, че сме отворили файл за четене и той е копиран в буфера. Сега използвайки ungetc()
сме променили някои знаци в буфера. Ето това, което просто не успявам да разбера дори след много усилия:
Ето какво каза за
ungetc()
--"Извикване на fseek, fsetpos или пренавиване на потока ще отхвърли всички знаци, които преди това са били поставени обратно в него с тази функция." --Как могат знаците, които вече са поставени в буфера да бъдат изхвърлени? Един подход е, че оригиналните символи, които са премахнати, се „запомнят“ и всеки нов знак, който е бил поставен, се идентифицира и заменя с оригинален знак. Но изглежда много неефективен. Другата опция е да заредите копие на оригиналния файл в буфера и поставете указателя на файла на предвидената позиция. Кой подход от тези два използва fseek, fsetpos или пренавиване, за да отхвърли знаците, поставени сungetc()
?За текстови потоци, как наличието на непрочетени знаци в потока, знаци, които са били въведени с помощта на
ungetc()
, влияе върху върнатата стойност наftell()
? Моето объркване възниква от следния ред заftell()
иungetc()
от тази връзка заftell
(ИЗТОЧНИК)
"За текстови потоци числовата стойност може да не е значима, но все пак може да се използва за възстановяване на позицията на същата позиция по-късно с помощта на fseek (ако има знаци, върнати обратно с помощта на ungetc, които все още чакат да бъдат прочетени, поведението е недефинирано)."
- Фокусирайки се върху последния ред на горния абзац, какво общо има
pending of being read
с изхвърлянето на знак "ungetc()-obtained"? Всеки път, когато четем знак, който е бил поставен в потока с помощта наungetc()
, той отхвърля ли се след четенето?