名前空間
変種
操作

std::fseek

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

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

stream がバイナリモードで開かれている場合、新しい位置は、 originSEEK_SET であればファイルの先頭から、 originSEEK_CUR であれば現在のファイル位置から、 originSEEK_END であればファイルの終端から測って、ちょうど offset バイトになります。 バイナリストリームは SEEK_END をサポートすることが要求されません (特に追加のヌルバイトが出力される場合)。

stream がテキストモードで開かれている場合、 offset に対してサポートされている値は、ゼロ (任意の origin に適用可能) および同じファイルに紐付けられているストリームに対する以前の std::ftell の呼び出しによって返された値 (originSEEK_SET の場合にのみ適用可能) だけです。

stream がワイド指向の場合、テキストストリームとバイナリストリーム両方の制限が適用されます (std::ftell の結果は SEEK_SET でのみ使用でき、ゼロは SEEK_SET および SEEK_CUR で使用できますが SEEK_END は使用できません)。

ファイル位置指示子の変更に加えて、 fseekstd::ungetc の効果を取り消し、ファイル終端ステータスをクリアします。

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

目次

[編集] 引数

stream - 変更するファイルストリーム
offset - origin からの相対位置を変更する文字数
origin - offset を加算する位置。 SEEK_SET, SEEK_CUR, SEEK_END のいずれかを指定できます

[編集] 戻り値

成功した場合は 0、そうでなければ非ゼロの値。

[編集] ノート

ワイドストリームで非終端位置にシークした後の、次の任意の出力関数の呼び出しは、例えば異なる長さのマルチバイトシーケンスを出力することによって、ファイルの残りを未定義の状態にします。

POSIX は既存のファイル終端を超えてシークすることを許しています。 このシークの後で出力を行なった場合、その隙間からの読み込みはゼロのバイト列を返します。 ファイルシステムがサポートしていれば、これはスパースファイルを作成します。

POSIX はまた、何らかのまだ書き込まれていないデータがある場合、 fseek はまず fflush を行うことを要求しています (しかしシフト状態が復元されるかどうかは処理系定義です)。 標準 C++ のファイルストリームはフラッシュとシフト解除の両方を保証しています (std::basic_filebuf::seekoff)。

[編集]

#include <cstdio>
#include <cstdint>
#include <vector>
#include <fstream>
#include <cassert>
 
int main()
{
    std::ofstream("dummy.nfo") << "sample data\n";
 
 
    std::FILE* fp = std::fopen("dummy.nfo", "rb");
    assert(fp);
 
    std::fseek(fp, 0, SEEK_END); // seek to end
    std::size_t filesize = std::ftell(fp);
 
    std::fseek(fp, 0, SEEK_SET); // seek to start
    std::vector<uint8_t> buffer(filesize);
    std::fread(buffer.data(), sizeof(uint8_t), buffer.size(), fp);
 
    std::fclose(fp);
    std::printf("i've read %zi bytes\n", filesize);
}

出力:

i've read 12 bytes

[編集] 関連項目

ファイル位置指示子をファイル内の指定された位置に移動させます
(関数) [edit]
ファイル位置指示子を取得します
(関数) [edit]
現在のファイル位置指示子を返します
(関数) [edit]
ファイル位置指示子をファイルの先頭に移動させます
(関数) [edit]