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

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

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


fsetpos関数

概要

ファイルポジションを設定する。

ヘッダ

stdio.h

形式

int fsetpos(FILE* stream, const fpos_t* pos);

引数

stream

対象のストリーム。

pos

fgetpos関数で取得したファイルポジションの値。

戻り値

成功したら 0、失敗したら 0以外を返す。

詳細

fgetpos関数で取得した情報に従って、ファイルポジションを変更する。また、ストリームに mbstate_t型のオブジェクトがあれば、その値も変更する。

成功すると、ファイル終了指示子がクリアされる(つまり、feof関数が偽を返すようになる)。また、ungetc関数によってバッファへ押し戻された文字もクリアされる。

読み取りエラーや書き込みエラーが発生することがあり、その場合、対象のストリームにエラー指示子がセットされる。

失敗した場合、errno に処理系定義の正の値が格納される。

注意

引数pos に渡す値は、同じストリームに対する fgetpos関数によって取得したものでなければならない。

使用例

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

void print_line(FILE* fp);

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

    fpos_t pos;
    print_line(fp);
    if (fgetpos(fp, &pos) != 0) {
        fputs("ファイルポジションの取得に失敗しました。\n", stderr);
        exit(EXIT_FAILURE);
    }
    print_line(fp);
    print_line(fp);
    if (fsetpos(fp, &pos) != 0) {
        fputs("ファイルポジションの移動に失敗しました。\n", stderr);
        exit(EXIT_FAILURE);
    }
    print_line(fp);

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

void print_line(FILE* fp)
{
    char buf[80];

    if (fgets(buf, sizeof(buf), fp) == NULL) {
        fputs("ファイルへの書き込みに失敗しました。\n", stderr);
        exit(EXIT_FAILURE);
    }

    // 末尾の改行文字を取り除く
    char* p = strchr(buf, '\n');
    if (p != NULL) {
        *p = '\0';
    }

    puts(buf);
}

入力ファイル(test.txt)

aaaaa
bbbbb
ccccc
ddddd

実行結果:

aaaaa
bbbbb
ccccc
bbbbb

関連

この関数に渡す値は、fgetpos関数で得られる。

解説章

第41章


参考リンク


更新履歴

’2018/8/4 「関連」の内容が fgetpos関数のページのものと同じになっていたのを修正。

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

’2018/4/7 「詳細」に、mbstate_t やエラー指示子のセットに関する話題を追加。
本編の章立てが変わっていたので、「解説章」のリンク先を修正。

’2018/1/22 新規作成。



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

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

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

Programming Place Plus のトップページへ



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