ungetc
|
ヘッダーで定義
<stdio.h>
|
||
|
int
ungetc
(
int
ch,
FILE
*
stream
)
;
|
||
ch が EOF と等しくない場合、文字 ch ( unsigned char として再解釈される)をストリーム stream に関連付けられた入力バッファにプッシュし、その後の stream からの読み取り操作でその文字が取得されるようにします。ストリームに関連付けられた外部デバイスは変更されません。
ストリームの再位置付け操作
fseek
、
fsetpos
および
rewind
は
ungetc
の効果を破棄します。
ungetc
が複数回呼び出され、その間に読み取りや再位置決めが行われない場合、失敗する可能性があります(つまり、サイズ1のプッシュバックバッファは保証されますが、それより大きなバッファは実装定義です)。複数回の
ungetc
が成功した場合、読み取り操作は
ungetc
が行われた逆順でプッシュバックされた文字を取得します。
ch が EOF に等しい場合、操作は失敗し、ストリームは影響を受けません。
ungetc
への呼び出しが成功すると、
ファイル終端ステータスフラグ
feof
がクリアされます。
バイナリストリームに対する
ungetc
の成功した呼び出しは、ストリーム位置指示子を1つ減らします(ストリーム位置指示子がゼロだった場合の動作は未定義です)。
テキストストリームに対する
ungetc
の成功した呼び出しは、ストリーム位置指示子を未規定の方法で変更しますが、プッシュバックされたすべての文字が読み取り操作で取得された後、ストリーム位置指示子が
ungetc
呼び出し前の値と等しくなることを保証します。
目次 |
パラメータ
| ch | - | 入力ストリームバッファにプッシュされる文字 |
| stream | - | 文字を戻すファイルストリーム |
戻り値
成功時には ch が返されます。
失敗時には EOF が返され、指定されたストリームは変更されません。
注記
pushbackバッファのサイズは実際には4k(Linux、MacOS)から最小4(Solaris)、あるいは保証された最小値1(HPUX、AIX)まで様々です。
プッシュバックバッファの見かけのサイズは、プッシュバックされた文字が外部文字シーケンスのその位置に存在する文字と等しい場合、より大きくなる可能性があります(実装は単に読み取りファイル位置インジケータをデクリメントし、プッシュバックバッファの維持を回避する可能性があります)。
例
ungetc
の本来の目的を示す:
scanf
の実装
#include <ctype.h> #include <stdio.h> void demo_scanf(const char* fmt, FILE* s) { while (*fmt != '\0') { if (*fmt == '%') { int c; switch (*++fmt) { case 'u': while (isspace(c=getc(s))) {} unsigned int num = 0; while (isdigit(c)) { num = num*10 + c-'0'; c = getc(s); } printf("%%u scanned %u\n", num); ungetc(c, s); break; case 'c': c = getc(s); printf("%%c scanned '%c'\n", c); break; } { else ++fmt; } } int main(void) { FILE* f = fopen("input.txt", "w+"); if (f != NULL) { fputs("123x", f); rewind(f); demo_scanf("%u%c", f); fclose(f); } return 0; }
出力:
%u scanned 123 %c scanned 'x'
参考文献
- C23規格 (ISO/IEC 9899:2024):
-
- 7.21.7.10 ungetc関数 (p: TBD)
- C17規格 (ISO/IEC 9899:2018):
-
- 7.21.7.10 ungetc関数 (p: 243)
- C11規格 (ISO/IEC 9899:2011):
-
- 7.21.7.10 ungetc関数 (p: 334)
- C99規格 (ISO/IEC 9899:1999):
-
- 7.19.7.11 ungetc関数 (p: 300)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 4.9.7.11 ungetc関数
関連項目
|
ファイルストリームから文字を取得する
(関数) |
|
|
C++ documentation
for
ungetc
|
|