fseek、_fseeki64fseek, _fseeki64

指定した場所にファイル ポインターを移動します。Moves the file pointer to a specified location.

構文Syntax

int fseek(
   FILE *stream,
   long offset,
   int origin
);
int _fseeki64(
   FILE *stream,
   __int64 offset,
   int origin
);

パラメーターParameters

一連stream
FILE 構造体へのポインター。Pointer to FILE structure.

offsetoffset
配信元からのバイト数。Number of bytes from origin.

発行origin
最初の位置。Initial position.

戻り値Return Value

成功した場合、 fseek_fseeki64は0を返します。If successful, fseek and _fseeki64 returns 0. それ以外の場合は、0 以外の値を返します。Otherwise, it returns a nonzero value. シーク非対応のデバイスでは、戻り値は未定義です。On devices incapable of seeking, the return value is undefined. Streamが null ポインターの場合、またはoriginが以下で説明する許可値のいずれでもない場合は、「パラメーターの検証」で説明されているように、 fseek_fseeki64によって無効なパラメーターハンドラーが呼び出されます。If stream is a null pointer, or if origin is not one of allowed values described below, fseek and _fseeki64 invoke the invalid parameter handler, as described in Parameter Validation. 実行の継続が許可された場合、これらの関数はerrnoEINVALに設定し、-1 を返します。If execution is allowed to continue, these functions set errno to EINVAL and return -1.

解説Remarks

Fseek関数と _fseeki64関数は、ストリームに関連付けられているファイルポインター (存在する場合) を、原点からのオフセットバイトである新しい場所に移動します。The fseek and _fseeki64 functions moves the file pointer (if any) associated with stream to a new location that is offset bytes from origin. ストリームの次の操作は、新しい場所で行われます。The next operation on the stream takes place at the new location. 更新用に開かれているストリームでの次の操作は読み取りまたは書き込みのいずれかです。On a stream open for update, the next operation can be either a read or a write. 引数のoriginは、STDIO で定義されている、次の定数のいずれかである必要があります。始めThe argument origin must be one of the following constants, defined in STDIO.H:

配信元の値origin value 説明Meaning
SEEK_CURSEEK_CUR ファイル ポインターの現在の位置。Current position of file pointer.
SEEK_ENDSEEK_END EOF (ファイル終端)。End of file.
SEEK_SETSEEK_SET ファイルの先頭。Beginning of file.

Fseek_fseeki64を使用すると、ファイル内の任意の場所にポインターを移動できます。You can use fseek and _fseeki64 to reposition the pointer anywhere in a file. ポインターは、ファイルの末尾を越えて配置することもできます。The pointer can also be positioned beyond the end of the file. fseek_fseeki64は、ファイルの終端のインジケーターをクリアし、ストリームに対する以前のungetc呼び出しの効果を否定します。fseek and _fseeki64 clears the end-of-file indicator and negates the effect of any prior ungetc calls against stream.

データを追加するためにファイルを開く場合、現在のファイルの位置は、次の書き込みが発生する場所ではなく最後の I/O 操作によって決まります。When a file is opened for appending data, the current file position is determined by the last I/O operation, not by where the next write would occur. 追加のために開かれたファイルで I/O 操作がまだ発生していない場合、ファイルの位置はファイルの先頭です。If no I/O operation has yet occurred on a file opened for appending, the file position is the start of the file.

テキストモードで開かれたストリームについては、 fseek_fseeki64では使用が制限されています。これは、キャリッジリターンラインフィードの変換によって、 fseekおよび _fseeki64によって予期しない結果が生じる可能性があるためです。For streams opened in text mode, fseek and _fseeki64 have limited use, because carriage return-line feed translations can cause fseek and _fseeki64 to produce unexpected results. テキストモードで開かれたストリームで動作することが保証されるfseek操作と _fseeki64操作は次のとおりです。The only fseek and _fseeki64 operations guaranteed to work on streams opened in text mode are:

  • 元の値のいずれかに対して相対的なオフセット 0 でシークします。Seeking with an offset of 0 relative to any of the origin values.

  • Fseekまたは_ftelli64を使用するときに、 _fseeki64を使用するときに、 ftellの呼び出しから返されたオフセット値を使用して、ファイルの先頭からシークします。Seeking from the beginning of the file with an offset value returned from a call to ftell when using fseek or _ftelli64 when using _fseeki64.

テキスト モードでも、Ctrl + Z は入力時に EOF (EOF: end-of-file) 文字として解釈されます。Also in text mode, CTRL+Z is interpreted as an end-of-file character on input. 読み取り/書き込み用に開かれたファイルでは、 fopenと関連するすべてのルーチンで、ファイルの末尾に CTRL + Z があるかどうかを確認し、可能であれば削除します。In files opened for reading/writing, fopen and all related routines check for a CTRL+Z at the end of the file and remove it if possible. これは、 fseekftellまたは _fseeki64_ftelli64の組み合わせを使用して、CTRL + Z で終わるファイル内を移動すると、ファイルの末尾付近でfseekまたは _fseeki64が正しく動作しなくなる可能性があるためです。This is done because using the combination of fseek and ftell or _fseeki64 and _ftelli64, to move within a file that ends with a CTRL+Z may cause fseek or _fseeki64 to behave improperly near the end of the file.

バイト オーダー マーク (BOM) で始まるファイルを CRT で開くときには、ファイル ポインターは BOM の後ろ (つまり、ファイルの実際のコンテンツの開始位置) に配置されます。When the CRT opens a file that begins with a Byte Order Mark (BOM), the file pointer is positioned after the BOM (that is, at the start of the file's actual content). ファイルの先頭をfseekする必要がある場合は、 ftellを使用して最初の位置を取得し、0の位置ではなくfseekを使用します。If you have to fseek to the beginning of the file, use ftell to get the initial position and fseek to it rather than to position 0.

この関数では、実行中に他のスレッドをロックするので、スレッド セーフです。This function locks out other threads during execution and is therefore thread-safe. ロックしないバージョンについては、「_fseek_nolock、_fseeki64_nolock」を参照してください。For a non-locking version, see _fseek_nolock, _fseeki64_nolock.

既定では、この関数のグローバル状態はアプリケーションにスコープが設定されています。By default, this function's global state is scoped to the application. これを変更するには、「 CRT でのグローバル状態」を参照してください。To change this, see Global state in the CRT.

必要条件Requirements

関数Function 必須ヘッダーRequired header
fseekfseek <stdio.h><stdio.h>
_fseeki64_fseeki64 <stdio.h><stdio.h>

互換性の詳細については、「互換性」を参照してください。For additional compatibility information, see Compatibility.

Example

// 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'.

関連項目See also

ストリーム入出力Stream I/O
fopen、_wfopenfopen, _wfopen
ftell、_ftelli64ftell, _ftelli64
_lseek、_lseeki64_lseek, _lseeki64
巻きrewind