標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
ISO C |
両方 |
#include <stdio.h>
int fsetpos(FILE *stream, const fpos_t *pos);
#define _OPEN_SYS_UNLOCKED_EXT 1
#include <stdio.h>
int fsetpos_unlocked(FILE *stream, const fpos_t *pos);
fsetpos() 関数は、stream に関連するファイル位置を、pos で指された オブジェクトの値に応じて、ファイル内の新しい位置へ移動します。fgetpos() 関数を呼び出して pos の値を取得する 必要があります。正常終了した場合、fsetpos() 関数は、EOF 標識をクリアし、直前 の ungetc() または ungetwc() 関数の同じストリームに対する影響を 取り消します。
fsetpos() 関数の呼び出しが無効な場合、その呼び出しはフラッシュ として扱われ、ungetc 文字は廃棄されます。
fsetpos() 関数は、ワイド指向ファイルのために 2 バイト 文字セット (DBCS) 状態情報を扱います。既に存在していない位置に対する fsetpos() 関数呼び出しは、エラーになります。
テキスト・ストリームの場合、DBCS シフト状態は、パフォーマンスの問題 を含みますが、レコードの開始から再計算されます。fsetpos() 関数は、マルチバイト文字の先頭に位置を変更します。
バイナリー・ストリームの場合、DBCS シフト状態は、fsetpos() 関数に よって保管された状態に設定されます。そうするうちにレコードが更新されると、シフト状態は 誤りになります。
fsetpos() 関数呼び出しの後のストリームに対する更新モードでの次の操作 は、入力操作でも出力操作でも構いません。
マルチボリューム・データ・セットのパフォーマンス: 一般的に fgetpos() 関数および fsetpos() 関数を使用すると、位置変更のパフォーマンスが ftell() 関数および fseek() 関数と比較してよくなります (マルチボリューム・データ・セットで作業する場合)。
MVS データ・セット、VSAM データ・セット、および z/OS UNIX ファイルの大規模ファイル・サポート: fsetpos() 関数は、大規模ファイルの操作を暗黙的にサポートします。大規模ファイルでこの関数を使用するには、_LARGE_FILES フィーチャー・テスト・マクロの定義は不要です。
fsetpos() 関数は、ファイルの現在位置を正常に変更した場合、値 0 を戻します。
正常に実行されなかった場合、fsetpos() 関数はゼロ以外を戻し、errno を設定します。
/* This example opens a file called myfile.dat for reading.
After performing input operations (not shown), it moves the file
pointer to the beginning of the file and rereads the first byte.
*/
#include <stdio.h>
int main(void)
{
FILE *stream;
int retcode;
fpos_t pos, pos1, pos2, pos3;
char ptr[20]; /* existing file 'myfile.dat' has 20 byte records */
/* Open file, get position of file pointer, and read first record */
stream = fopen("myfile.dat", "rb");
fgetpos(stream,&pos);
pos1 = pos;
if (!fread(ptr,sizeof(ptr),1,stream))
printf("fread error¥n");
/* Perform a number of read operations. The value of 'pos'
changes if 'pos' is passed to fgetpos() */
⋮
/* Re-set pointer to start of file and re-read first record */
fsetpos(stream,&pos1);
if (!fread(ptr,sizeof(ptr),1,stream))
printf("fread error¥n");
fclose(stream);
}