名前空間
変種
操作

ungetc

提供: cppreference.com
< c‎ | io
 
 
ファイル入出力
関数
ファイルアクセス
直接入出力
書式なし入出力
(C11以前)(C11およびそれ以降)
ungetc
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)
書式付き入力
書式付き出力
ファイル位置操作
エラー処理
ファイルに対する操作
 
ヘッダ <stdio.h> で定義
int ungetc( int ch, FILE *stream );

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

ストリームの位置を再設定する操作 fseekfsetpos および rewindungetc の効果を破棄します。

読み込みまたは位置の再設定を挟まずに ungetc が2回以上呼ばれた場合、 ungetc は失敗するかもしれません (別の言い方をすると、サイズ1のプッシュバックバッファは保証されていますが、それより大きいバッファは処理系定義です)。 複数回の ungetc に成功した場合、読み込み操作はプッシュバックされた文字を ungetc の逆順で取得します。

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

ungetc の呼び出しの成功は、ファイル終端状態フラグ feof をクリアします。

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

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

目次

[編集] 引数

ch - 入力ストリームのバッファにプッシュされる文字
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) {
    if(*fmt == '%') {
        int c;
        switch(*++fmt) {
            case 'u': while(isspace(c=getc(s))) {} // skip leading white space
                      unsigned int num = 0;
                      while(isdigit(c)) {
                          num = num*10 + c-'0';
                          c = getc(s);
                      }
                      printf("%%u scanned %u\n", num);
                      ungetc(c, s); // reprocess the non-digit
            case 'c': c = getc(s);
                      printf("%%c scanned '%c'\n", c);
        }
    } 
}
 
int main(void)
{
    FILE* f = fopen("input.txt", "w+");
    fputs("123x", f);
    rewind(f); 
    demo_scanf("%u%c", f);
    fclose(f);
}

出力:

%u scanned 123
%c scanned 'x'

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.21.7.10 The ungetc function (p: 334)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.19.7.11 The ungetc function (p: 300)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.9.7.11 The ungetc function

[編集] 関連項目

ファイルストリームから文字を取得します
(関数) [edit]