名前空間
変種
操作

std::fseek

From cppreference.com
< cpp‎ | io‎ | c
 
 
 
C形式I/O
型とオブジェクト
関数
ファイルアクセス
直接入出力
非書式化入出力
書式付き入力
(C++11)(C++11)(C++11)    
(C++11)(C++11)(C++11)    
書式付き出力
ファイルポジショニング
fseek
エラーハンドリング
ファイル操作
 
ヘッダ<cstdio>で定義
int fseek( std::FILE* stream, long offset, int origin );

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

ストリーム stream がバイナリモードで開かれている場合、新しい位置は、originSEEK_SET の場合はファイルの先頭から offset バイト、originSEEK_CUR の場合は現在のファイル位置から offset バイト、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_SETSEEK_CURSEEK_END

[編集] 戻り値

成功した場合は 0、それ以外の場合は非ゼロの値。

[編集] 注記

ワイドストリームで末尾以外の位置にシークした後、次に出力関数を呼び出すと、ファイルの残りの部分が未定義になる可能性があります。たとえば、異なる長さのマルチバイトシーケンスを出力することによって。

POSIX は、ファイルの既存の末尾を超えてシークすることを許可します。このシーク後に書き込みが行われた場合、ギャップからの読み取りは 0 バイトを返します。ファイルシステムによってサポートされている場合、これは *スパースファイル* を作成します。

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

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

Windows では、2 GiB より大きいファイルを扱うには _fseeki64 を使用できます。

[編集]

#include <cassert>
#include <cstdio>
#include <cstdint>
#include <fstream>
#include <vector>
 
int main()
{
    std::ofstream("dummy.nfo") << "8 bytes\n"; // create the file
 
    std::FILE* fp = std::fopen("dummy.nfo", "rb");
    assert(fp);
 
    std::fseek(fp, 0, SEEK_END); // seek to end
    const std::size_t filesize = std::ftell(fp);
    std::vector<std::uint8_t> buffer(filesize);
 
    std::fseek(fp, 0, SEEK_SET); // seek to start
    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

[編集] 関連項目

ファイル位置指示子をファイル内の特定の場所に移動する
(関数) [編集]
ファイル位置指示子を取得する
(関数) [編集]
現在のファイル位置指示子を返す
(関数) [編集]
ファイル位置指示子をファイルの先頭に移動する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)