ungetc
, ungetwc
ストリームに文字をプッシュ バックします。
構文
int ungetc(
int c,
FILE *stream
);
wint_t ungetwc(
wint_t c,
FILE *stream
);
パラメーター
c
プッシュする文字。
stream
FILE
構造体へのポインター。
戻り値
正常に終了した場合、これらの各関数は文字引数 c
を返します。 c
がプッシュ バックできない場合、または文字が読まれなかった場合は、入力ストリームは変更されず、ungetc
は EOF
を返します。ungetwc
は、WEOF
を返します。 stream
が NULL
の場合は、「パラメーターの検証」で説明されているように、無効なパラメーター ハンドラーが呼び出されます。 実行を続行できる場合は、 EOF
または WEOF
が返され、 errno
が EINVAL
に設定されます。
これらのエラー コードおよびその他のエラー コードの詳細については、「errno
、_doserrno
、_sys_errlist
、_sys_nerr
」を参照してください。
解説
ungetc
関数は c
に文字 stream
をプッシュ バックし、EOF インジケーターをクリアします。 ストリームは、読み取り用に開かれている必要があります。 stream
に対する後続の読み取り操作は、c
で始まります。 EOF
を使用してストリームに ungetc
をプッシュする操作は無視されます。
ungetc
がストリームに入れた文字は、その文字をストリームから読み取る前に fflush
、fseek
、fsetpos
、または rewind
が呼び出されると削除されることがあります。 ファイル位置インジケーターの値は、文字がプッシュ バックされる前のファイル位置インジケーターの値になります。 ストリームに対応する外部のストレージは変更されません。 テキスト ストリームに対する ungetc
の正常な呼び出しでは、プッシュ バックされたすべての文字が読み取りまたは破棄されるまで、ファイル位置インジケーターは未指定です。 バイナリ ストリームに対する ungetc
の正常な呼び出しでは、ファイル位置インジケーターがデクリメントされます。呼び出し前の値が 0 の場合、呼び出しの後の値は未定義です。
ungetc
を 2 回の呼び出したときに、呼び出しの間に読み取りまたはファイル位置の操作をしなかった場合は、結果は予測できません。 fscanf
の呼び出し後、別の読み取り操作 (getc
など) が実行されていない限り、ungetc
の呼び出しは失敗する可能性があります。これは、fscanf
自体がungetc
を呼び出しているためです。
ungetwc
関数は、ungetc
関数のワイド文字バージョンです。 しかし、テキスト ストリームまたはバイナリ ストリームに対する ungetwc
の正常な呼び出しでは、プッシュ バックされたすべての文字が読み取りまたは破棄されるまで、ファイル位置インジケーターの値は未指定です。
これらの関数はスレッド セーフであり、実行時に重要情報をロックします。 ロックしないバージョンについては、「_ungetc_nolock
、_ungetwc_nolock
」を参照してください。
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。
汎用テキスト ルーチンのマップ
TCHAR.H のルーチン | _UNICODE と _MBCS が定義されていない |
_MBCS が定義されている |
_UNICODE が定義されている |
---|---|---|---|
_ungettc |
ungetc |
ungetc |
ungetwc |
要件
ルーチンによって返される値 | 必須ヘッダー |
---|---|
ungetc |
<stdio.h> |
ungetwc |
<stdio.h> または <wchar.h> |
ユニバーサル Windows プラットフォーム (UWP) アプリではコンソールがサポートされていません。 コンソール (stdin
、stdout
、stderr
) に関連付けられている標準ストリームのハンドルは、C ランタイム関数によって UWP アプリで使用される前に、リダイレクトする必要があります。 互換性の詳細については、「 Compatibility」を参照してください。
例
// crt_ungetc.c
// This program first converts a character
// representation of an unsigned integer to an integer. If
// the program encounters a character that is not a digit,
// the program uses ungetc to replace it in the stream.
//
#include <stdio.h>
#include <ctype.h>
int main( void )
{
int ch;
int result = 0;
// Read in and convert number:
while( ((ch = getchar()) != EOF) && isdigit( ch ) )
result = result * 10 + ch - '0'; // Use digit.
if( ch != EOF )
ungetc( ch, stdin ); // Put nondigit back.
printf( "Number = %d\nNext character in stream = '%c'",
result, getchar() );
}
521aNumber = 521
Next character in stream = 'a'