名前空間
変種
操作

ungetc

From cppreference.com
< c‎ | io
 
 
ファイル入出力
型とオブジェクト
        
関数
ファイルアクセス
(C95)
非書式化入出力
(C11まで)(C11)
ungetc
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

書式付き入力
直接入出力
書式付き出力
ファイルポジショニング
エラーハンドリング
ファイル操作
 
ヘッダー <stdio.h> で定義
int ungetc( int ch, FILE* stream );

chEOF と等しくない場合、ストリーム stream に関連付けられた入力バッファに文字 ch (unsigned char として再解釈される) をプッシュします。これにより、後続の stream からの読み込み操作でその文字が取得されるようになります。ストリームに関連付けられた外部デバイスは変更されません。

ストリームの再配置操作である fseekfsetpos、および rewind は、ungetc の効果を破棄します。

読み込みまたは再配置を挟まずに ungetc が複数回呼び出された場合、失敗する可能性があります (つまり、サイズ 1 のプッシュバックバッファは保証されますが、それより大きいバッファは実装依存です)。複数の ungetc が成功した場合、読み込み操作はプッシュバックされた文字を ungetc の逆順で取得します。

chEOF と等しい場合、操作は失敗し、ストリームは影響を受けません。

ungetc の成功した呼び出しは、ファイル終端ステータスフラグ feof をクリアします。

バイナリストリームに対する ungetc の成功した呼び出しは、ストリーム位置インジケータを 1 だけデクリメントします (ストリーム位置インジケータがゼロだった場合の動作は不定です)。

テキストストリームに対する ungetc の成功した呼び出しは、ストリーム位置インジケータを不定な方法で変更しますが、プッシュバックされたすべての文字が読み込み操作で取得された後、ストリーム位置インジケータが ungetc 実行前の値と等しくなることを保証します。

目次

[編集] パラメータ

文字 - 入力ストリームバッファにプッシュする文字
stream - 文字を戻すファイルストリーム

[編集] 戻り値

成功した場合、ch が返されます。

失敗した場合、EOF が返され、指定されたストリームは変更されません。

[編集] 注釈

プッシュバックバッファのサイズは、実際には 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 The ungetc function (p: TBD)
  • C17標準 (ISO/IEC 9899:2018)
  • 7.21.7.10 The ungetc function (p: 243)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.21.7.10 The ungetc function (p: 334)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.19.7.11 The ungetc function (p: 300)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • 4.9.7.11 The ungetc function

[編集] 関連項目

ファイルストリームから1文字取得する
(関数) [編集]
C++ ドキュメント ungetc の場合
English 日本語 中文(简体) 中文(繁體)