Namespaces
Variants

std:: fseek

From cppreference.net
< cpp ‎ | io ‎ | c
ヘッダーで定義 <cstdio>
int fseek ( std:: FILE * stream, long offset, int origin ) ;

ファイルストリーム stream のファイル位置指示子を設定します。

ストリームがバイナリモードで開かれている場合、 stream がバイナリモードで開かれている場合、新しい位置は origin SEEK_SET の場合はファイル先頭から正確に offset バイト、 origin SEEK_CUR の場合は現在のファイル位置から、 origin SEEK_END の場合はファイル末尾から測定されます。バイナリストリームは SEEK_END をサポートする必要はなく、特に追加のnullバイトが出力される場合があります。

ストリームがテキストモードで開かれている場合、 offset でサポートされる値は、ゼロ(これは任意の origin で動作する)と、同じファイルに関連付けられたストリームに対する以前の std::ftell の呼び出しで返された値(これは origin SEEK_SET の場合にのみ動作する)のみです。

ストリームがワイド指向の場合、テキストストリームとバイナリストリームの両方の制限が適用されます( std::ftell の結果は SEEK_SET とゼロオフセットが許可され、 SEEK_SET SEEK_CUR からのオフセットは許可されますが、 SEEK_END からのオフセットは許可されません)。

ファイル位置指示子を変更することに加えて、 fseek std::ungetc の効果を取り消し、該当する場合はファイル終端ステータスをクリアします。

読み取りまたは書き込みエラーが発生した場合、ストリームのエラーインジケータ( std::ferror )が設定され、ファイル位置は影響を受けません。

目次

パラメータ

stream - 変更するファイルストリーム
offset - 起点からの相対位置をシフトする文字数
origin - offset が加算される位置。以下のいずれかの値を取ります: SEEK_SET , SEEK_CUR , SEEK_END

戻り値

0 成功時は0、それ以外の場合は非ゼロの値を返します。

注記

ワイドストリームで非終端位置にシークした後、任意の出力関数を次に呼び出すと、異なる長さのマルチバイトシーケンスを出力するなどして、ファイルの残りの部分が未定義状態になる可能性があります。

POSIXでは既存のファイル終端を超えるシークが許可されています。このシーク後に出力が行われると、ギャップからの読み取りはゼロバイトを返します。ファイルシステムでサポートされている場合、これは スパースファイル を作成します。

POSIXはまた、 fseek が未書き込みデータがある場合に最初に fflush を実行することを要求しています(ただし、シフト状態が復元されるかどうかは実装定義です)。標準C++ファイルストリームはフラッシュとアンシフトの両方を保証します: std::basic_filebuf::seekoff

POSIXは、 fseek がエラー時に - 1 を返し、 errno にエラーを示す値を設定することを規定しています。

Windowsでは、 _fseeki64 を使用して2 GiBを超えるファイルを操作できます。

#include <cassert>
#include <cstdio>
#include <cstdint>
#include <fstream>
#include <vector>
int main()
{
    std::ofstream("dummy.nfo") << "8 bytes\n"; // ファイルを作成
    std::FILE* fp = std::fopen("dummy.nfo", "rb");
    assert(fp);
    std::fseek(fp, 0, SEEK_END); // 末尾にシーク
    const std::size_t filesize = std::ftell(fp);
    std::vector<std::uint8_t> buffer(filesize);
    std::fseek(fp, 0, SEEK_SET); // 先頭にシーク
    std::fread(buffer.data(), sizeof(std::uint8_t), buffer.size(), fp);
    std::fclose(fp);
    std::printf("I've read %zi bytes\n", filesize);
}

出力例:

I've read 8 bytes

関連項目

ファイル位置指示子をファイル内の特定の位置に移動する
(関数)
ファイル位置指示子を取得する
(関数)
現在のファイル位置指示子を返す
(関数)
ファイル位置指示子をファイルの先頭に移動する
(関数)