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 に設定されます。
エラー コードの詳細については、「_doserrno、errno、_sys_errlist、および _sys_nerr」を参照してください。
解説
ungetc 関数は stream に文字 c をプッシュ バックし、EOF インジケーターをクリアします。 ストリームは、読み取り用に開かれている必要があります。 stream の後続の読み取り操作は、c から始まります。ungetc を使用してストリームに EOF をプッシュする操作は無視されます。
ungetc がストリームに入れた文字は、その文字をストリームから読み取る前に fflush、fseek、fsetpos、または rewind が呼び出されると削除されることがあります。 ファイル位置インジケーターの値は、文字がプッシュ バックされる前のファイル位置インジケーターの値になります。 ストリームに対応する外部のストレージは変更されません。 テキスト ストリームに対する ungetc の正常な呼び出しでは、プッシュ バックされたすべての文字が読み取りまたは破棄されるまで、ファイル位置インジケーターは未指定です。 バイナリ ストリームに対する ungetc の正常な呼び出しでは、ファイル位置インジケーターがデクリメントされます。呼び出し前の値が 0 の場合、呼び出しの後の値は未定義です。
ungetc を 2 回の呼び出したときに、呼び出しの間に読み取りまたはファイル位置の操作をしなかった場合は、結果は予測できません。 fscanf の呼び出し後に、他の読み取り操作 (getc など) が行われない場合は、ungetc の呼び出しが失敗する可能性があります。 これは fscanf 自体が ungetc を呼び出すためです。
ungetwc 関数は、ungetc 関数のワイド文字バージョンです。 しかし、テキスト ストリームまたはバイナリ ストリームに対する ungetwc の正常な呼び出しでは、プッシュ バックされたすべての文字が読み取りまたは破棄されるまで、ファイル位置インジケーターの値は未指定です。
これらの関数はスレッド セーフであり、実行時に重要情報をロックします。 ロックしないバージョンについては、「_ungetc_nolock、_ungetwc_nolock」を参照してください。
汎用テキスト ルーチンのマップ
TCHAR.H のルーチン |
_UNICODE & _MBCS が未定義の場合 |
_MBCS が定義されている場合 |
_UNICODE が定義されている場合 |
---|---|---|---|
_ungettc |
ungetc |
ungetc |
ungetwc |
必要条件
ルーチン |
必須ヘッダー |
---|---|
ungetc |
<stdio.h> |
ungetwc |
<stdio.h> または <wchar.h> |
コンソールは、Windows ストア アプリではサポートされていません。 コンソール (stdin、stdout、および stderr) に関連付けられている標準ストリームのハンドルは、C ランタイム関数によって Windows ストア アプリで使用する前に、リダイレクトする必要があります。 互換性の詳細については、「互換性」を参照してください。
使用例
// 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() );
}
同等の .NET Framework 関数
使用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。