Rückgängigmachen der Auswirkungen von ungetc (): "Wie" tun es fseek (), rewind () und fsetpos ()? Wird der Puffer jedes Mal aufgefüllt?

Huh !! Wie soll ich das Ganze in eine klare Frage stellen !! Lass es mich versuchen:

Ich weiß, dass die Dateien mit geöffnet wurdenfopen() Während eines Lesevorgangs aus der Datei wird der Inhalt der Datei zuerst in den Puffer gelesen, und wir lesen aus diesem Puffer. Ähnlich wird in einem Schreibvorgang in die Datei der Inhalt der Datei gelesen Der Inhalt wird zuerst in den Puffer und dann in die Datei geschrieben.

Aber was ist mitfseek(),fsetpos() undrewind()fallen lassen die Wirkung der vorherigen Aufrufe vonungetc()? Kannst du mir erzählenWie Ich meine, vorausgesetzt, wir haben eine Datei zum Lesen geöffnet und sie wird in den Puffer kopiertungetc() Wir haben einige Zeichen im Puffer geändert. Hier ist, was ich auch nach viel Mühe nicht verstehe:

Hier ist, was über das gesagt wurdeungetc() -"Ein Aufruf von fseek, fsetpos oder rewind on stream verwirft alle zuvor mit dieser Funktion eingegebenen Zeichen." --Wie können bereits in den Puffer eingegebene Zeichen verworfen werden? Ein Ansatz ist, dass die entfernten Originalzeichen "erinnert" werden und jedes neu eingegebene Zeichen identifiziert und durch das Originalzeichen ersetzt wird. Aber es scheint sehr ineffizient zu sein. Die andere Möglichkeit besteht darin, eine Kopie der Originaldatei in den Puffer zu laden und den Dateizeiger an der vorgesehenen Position zu platzieren. Welche Methode dieser beiden Methoden verwendet wird, um die eingegebenen Zeichen zu verwerfen, ist fseek, fsetpos oder rewind takeungetc()?

Wie wirkt sich bei Textströmen das Vorhandensein ungelesener Zeichen im Stream aus, die mithilfe von Zeichen eingegeben wurden?ungetc()beeinflussen den Rückgabewert vonftell()Meine Verwirrung ergibt sich aus der folgenden Zeile überftell() undungetc() von diesem Link überftell(QUELLE)

"Für Textströme ist der numerische Wert möglicherweise nicht aussagekräftig, kann aber dennoch verwendet werden, um die Position später mit fseek (auf dieselbe Position zurückzusetzen."Wenn es Zeichen gibt, die mit ungetc zurückgesetzt wurden und noch nicht gelesen wurden, ist das Verhalten undefiniert). "

Konzentriert man sich auf die letzte Zeile des obigen Absatzes, was hatpending of being read hat das damit zu tun, dass ein "ungetc () - erhaltenes" Zeichen verworfen wird? Jedes Mal, wenn wir ein Zeichen lesen, das mit in den Stream eingefügt wurdeungetc(),ist esnach dem Lesen verworfen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage