arrow 若葉プログラミング塾 > 知識の玉手箱 > C関数リファレンス >
ungetc()
ungetc()

この関数の目的

ungetc()は、ストリームから文字を取り込む操作を元に戻す。

定義

	#include <stdio.h>
	int ungetc(int c, FILE *stream);

働き

この関数は c (unsigned char に変換される)で指定される文字を stream が指す入力ストリーム押し戻す。 押し戻された文字は、押し戻されたのとは逆の順序で続けて読み込まれる。 介入するファイル位置調整関数( fseek()fsetpos()rewind() )が stream に関して成功すれば、押し戻された文字は捨てられる。 ストリームに関する外部の記憶域は変更されない。

1文字の押し戻しは保証される。 ungetc() が読み込みやファイル位置調整の操作を介在させずに多く呼ばれすぎたなら、操作は失敗するかもしれない。

c の値が EOF に等しかった場合、操作は失敗し入力ストリームは変更されない。

関数呼び出しが成功すれば、ストリームのファイルの終わり指定子を解除する。 押し戻し操作を全て元に戻したときのファイル位置指定子は、 ungetc() を呼ぶ前と同じようにならなければならない。 テキストストリームでは、 ungetc() が成功した後で、押し戻された文字が全て読み込まれるか捨てられるかしないと、ファイル位置指定子の値は特定されない。 バイナリストリームでは、ファイル位置指定子は ungetc() が成功するたびに減らされる。 呼び出しの前に値が 0 だった場合、関数が返った後の値は不定になる。

返り値は、変換した後の、押し戻した文字である。操作が失敗すれば、 EOF である。

解説

出力ストリームに押し戻してはいけない。

EOF を押し戻してはいけない。(バイナリでは困るのだが)

2文字以上押し戻した文字が読み直せるとは限らない。

この関数を使えば、ストリームの一つ先の文字をのぞき見る(peek)という作業ができる。 以下のようなマクロを定義しておけば、この作業は楽である。なお、標準入力をのぞき見るのはやめたほうがよい。

	#define peek(fp) (ungetc(getc(fp), fp))
arrow 若葉プログラミング塾 > 知識の玉手箱 > C関数リファレンス >
KC