ungetc | Programming Place Plus C言語編 標準ライブラリのリファレンス

トップページC言語編標準ライブラリのリファレンス(名前順)

トップページC言語編標準ライブラリのリファレンス(ヘッダ別)


ungetc関数

概要

文字を入力ストリームへ押し戻す。

ヘッダ

stdio.h

形式

int ungetc(int c, FILE* stream);

引数

c

押し戻す文字。EOF に等しい場合は何も起こらず、失敗とみなされる。

stream

入力ストリーム。

戻り値

成功したら押し戻した文字 c がそのまま返される。失敗した場合には、EOF が返される。

詳細

押し戻された文字は、次回の getc関数などの呼び出し時に取り出される。複数押し戻していた場合は、逆順で取り出される。何文字まで押し戻すことが可能かは環境によるが、最低でも 1文字の押し戻しが可能であることは保証されている。
fseek関数rewind関数fsetpos関数によってファイルポジションが変更された場合、押し戻されていた文字はクリアされる。
この関数が成功した場合、対象のストリームのファイル終了指示子がクリアされる。つまり、feof関数が偽を返すような状態に戻される。

注意

使用例

#include <stdio.h>
#include <stdlib.h>

char get_char(FILE* fp)
{
    int c = fgetc(fp);
    if (c == EOF) {
        if (feof(fp) || ferror(fp)) {
            fputs("ファイルからの読み込みに失敗しました。\n", stderr);
            exit(EXIT_FAILURE);
        }
    }
    return (char)c;
}

int main(void)
{
    FILE* fp = fopen("test.txt", "r");
    if (fp == NULL) {
        fputs("ファイルオープンに失敗しました。\n", stderr);
        exit(EXIT_FAILURE);
    }

    // 1文字目を読み込む
    int c = get_char(fp);
    printf("%c\n", c);

    // 2文字目を読み込む
    c = get_char(fp);
    printf("%c\n", c);

    // 2文字目を押し戻す
    ungetc(c, fp);

    // 押し戻した文字が読み込まれる
    c = get_char(fp);
    printf("%c\n", c);

    if (fclose(fp) == EOF) {
        fputs("ファイルクローズに失敗しました。\n", stderr);
        exit(EXIT_FAILURE);
    }
}

入力ファイル (test.txt) :

abcde

実行結果:

a
b
b

関連

ワイド文字版の ungetwc関数がある。

解説章

第43章


参考リンク


更新履歴

’2018/4/22 解説中で C95 を(C89 に対して)特別扱いしないように修正。そもそもC言語編は C95ベースなので、余計な説明は省く。

’2018/4/18 「注意」の内容を「詳細」へ移動して、文章を修正。

’2018/1/22 新規作成。



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る