Namespaces
Variants

ungetc

From cppreference.net
< c ‎ | io
ヘッダーで定義 <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関数

関連項目

ファイルストリームから文字を取得する
(関数)