fseek、_fseeki64
更新 : 2007 年 11 月
指定された位置にファイル ポインタを移動します。
int fseek(
FILE *stream,
long offset,
int origin
);
int _fseeki64(
FILE *stream,
__int64 offset,
int origin
);
パラメータ
stream
FILE 構造体へのポインタ。offset
origin からのバイト数。origin
初期位置。
戻り値
成功した場合、fseek および _fseeki64 は 0 を返します。それ以外の場合は、0 以外の値を返します。シークできないデバイスの場合、戻り値は未定義です。stream が null ポインタの場合、または origin が次に説明するいずれの値でもない場合、「パラメータの検証」に説明されているように、fseek および _fseeki64 は無効なパラメータ ハンドラを呼び出します。実行の継続が許可された場合、これらの関数は errno を EINVAL に設定し、-1 を返します。
解説
fseek 関数および _fseeki64 関数は、stream に関連付けられたファイル ポインタがある場合、ポインタを origin から offset バイトの新しい位置に移動します。ストリームでの次の操作は、新しい位置で行われます。更新用に開いているストリームでは、次の操作は読み出しでも書き込みでもかまいません。引数 origin は、STDIO.H で定義されている次の定数のいずれかにする必要があります。
SEEK_CUR
ファイル ポインタの現在位置。SEEK_END
ファイルの終端。SEEK_SET
ファイルの先頭。
fseek および _fseeki64 を使用すると、ポインタの位置をファイル内のどこにでも移動できます。ポインタは、ファイルの終端を越えた場所にも配置できます。fseek および _fseeki64 は、EOF (end-of-file) インジケータを消去し、stream に対して呼び出された ungetc の結果をすべて無効にします。
ファイルをデータの追加モードで開くと、次の書き込みが行われる場所でなく、前の I/O 操作が行われた場所が現在のファイル位置となります。追加モードで開いたファイルで I/O 操作がまだ行われていない場合、ファイル位置はファイルの先頭になります。
テキスト モードで開いたストリームの場合、fseek および _fseeki64 の使用は制限されます。これは、復帰と改行の変換によって fseek および _fseeki64 で予測不可能な結果が発生することがあるためです。テキスト モードで開いたストリームで正しく動作することが保証されている fseek および _fseeki64 の操作は次のとおりです。
任意の origin 値からのオフセットが 0 のシーク
fseek の使用時には ftell、_fseeki64 の使用時には _ftelli64 への呼び出しで返されたオフセット値をファイルの先頭に加えた位置からのシーク。
また、テキスト モードでは、Ctrl + Z は入力時に EOF (EOF: end-of-file) 文字として解釈されます。読み出しおよび書き込み両用のモードで開かれたファイルでは、fopen および関連ルーチンがすべてファイル末尾の Ctrl + Z の有無を調べ、削除できる場合は削除します。この処理が行われる理由は、Ctrl + Z で終わるファイル内を fseek と ftell の組み合わせまたは _fseeki64 と _ftelli64 の組み合わせで移動すると、ファイルの終端付近で fseek または _fseeki64 が正しく動作しないことがあるためです。
CRT では、開いたファイルの先頭にバイト順マーク (BOM) が存在した場合、ファイル ポインタは BOM の直後 (つまり、ファイルの実際のコンテンツの先頭) に配置されます。ファイルの先頭まで fseek する必要がある場合は、単に位置 0 を指定するのではなく、まず、ftell を使用して先頭位置を取得してから、fseek でその位置に移動します。
この関数は実行中に他のスレッドをロックアウトするため、スレッド セーフになります。ロックしないバージョンについては、「_fseek_nolock、_fseeki64_nolock」を参照してください。
必要条件
関数 |
必須ヘッダー |
---|---|
fseek |
<stdio.h> |
_fseeki64 |
<stdio.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// crt_fseek.c
// This program opens the file FSEEK.OUT and
// moves the pointer to the file's beginning.
#include <stdio.h>
int main( void )
{
FILE *stream;
char line[81];
int result;
if ( fopen_s( &stream, "fseek.out", "w+" ) != 0 )
{
printf( "The file fseek.out was not opened\n" );
return -1;
}
fprintf( stream, "The fseek begins here: "
"This is the file 'fseek.out'.\n" );
result = fseek( stream, 23L, SEEK_SET);
if( result )
perror( "Fseek failed" );
else
{
printf( "File pointer is set to middle of first line.\n" );
fgets( line, 80, stream );
printf( "%s", line );
}
fclose( stream );
}
File pointer is set to middle of first line.
This is the file 'fseek.out'.