ハッ!!どうやって全体を明確な質問に入れましょうか!!試してみましょう:
を使用して開かれたファイルがメモリにバッファリングされることはわかっていますfopen()
。効率と容易さのためにバッファを使用します。ファイルからの読み取り中、ファイルの内容は最初にバッファに読み取られ、そのバッファから読み取ります。ファイルへの書き込みの場合、コンテンツは最初にバッファに書き込まれ、次にファイルに書き込まれます。
しかし、 の前の呼び出しの効果を削除するfseek()
とどうなるでしょうか? それがどのように行われるか教えていただけますか?つまり、読み取り用にファイルを開き、それがバッファにコピーされたとします。現在、バッファ内のいくつかの文字を変更しています。多くの努力:fsetpos()
rewind()
ungetc()
ungetc()
についての説明は次の
ungetc()
とおりです。「ストリームで fseek、fsetpos、または巻き戻しを呼び出すと、以前にこの関数で戻された文字はすべて破棄されます。」-- すでにバッファに入れられている文字をどのように破棄できますか? 1 つのアプローチは、取り除かれた元の文字を「記憶」し、入れられた新しい文字をそれぞれ識別して元の文字に置き換えることですが、非常に効率が悪いようです。もう 1 つのオプションは、元のファイルのコピーをバッファーにロードし、ファイル ポインターを目的の位置に配置することungetc()
です。テキストストリームの場合、ストリーム内の未読文字の存在、つまり using
ungetc()
に挿入された文字は、の戻り値にどのように影響しますか?私の混乱は、次の行についてと、このリンクについて( SOURCE )からftell()
生じますftell()
ungetc()
ftell
「テキスト ストリームの場合、数値は意味をなさない可能性がありますが、後で fseek を使用して位置を同じ位置に復元するために使用できます (まだ読み取り待ちの ungetc を使用して戻された文字がある場合、動作は未定義です)。」
- 上記の段落の最後の行に注目する
pending of being read
と、「ungetc() で取得した」文字が破棄されることに何の関係があるのでしょうか。を使用してストリームに入れられた文字を読み取るたびに、読み取り後ungetc()
に破棄されますか?