ungetc
, ungetwc
ストリームに文字をプッシュ バックします。
構文
int ungetc(
int c,
FILE *stream
);
wint_t ungetwc(
wint_t c,
FILE *stream
);
パラメーター
c
プッシュする文字。
stream
FILE
構造体へのポインター。
戻り値
成功した場合、これらの各関数は文字引数を返します c
。 プッシュ バックできない場合c
、または文字が読み取られない場合、入力ストリームは変更されず、ungetc
;ungetwc
を返EOF
します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
しが失敗することがあります。それ自体が呼び出ungetc
されるためfscanf
です。
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'
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示