std:: fseek
|
ヘッダーで定義
<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
関連項目
|
ファイル位置指示子をファイル内の特定の位置に移動する
(関数) |
|
|
ファイル位置指示子を取得する
(関数) |
|
|
現在のファイル位置指示子を返す
(関数) |
|
|
ファイル位置指示子をファイルの先頭に移動する
(関数) |
|
|
Cドキュメント
for
fseek
|
|