fseek, _fseeki64

將檔案指標移至指定的位置。

語法

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

參數

stream
FILE 結構的指標。

offset
來自 origin 的位元組數目。

origin
初始位置。

傳回值

如果成功,fseek_fseeki64 會傳回 0。 否則,它會傳回非零值。 在無法搜尋的裝置上,傳回的值為未定義。 如果 stream 是 Null 指標,或如果 origin 不是下面所述的其中一個允許值, fseek_fseeki64 叫用不正確參數處理常式,如參數驗證 中所述 。 如果允許繼續執行,這些函式會將 errno 設定為 EINVAL ,並傳回 -1。

備註

_fseeki64fseek 式會將與 stream 相關聯的檔案指標(如果有的話)移至來自 origin 的新位置。 offset 資料流的下一個作業會在新位置進行。 在開啟以供更新的資料流中,下一項作業可能是讀取或寫入。 引數 origin 必須是中 STDIO.H 定義的下列其中一個常數:

origin 值 意義
SEEK_CUR 檔案指標的目前位置。
SEEK_END 檔案結尾。
SEEK_SET 檔案開頭。

您可以使用 fseek_fseeki64 將指標重新放置在檔案中的任何位置。 指標也可以放置在超過檔案結尾的位置。 fseek_fseeki64 會清除檔案結尾指標,並否定對 的任何先前 ungetc 呼叫 stream 的效果。

檔案因為附加資料而開啟時,目前的檔案位置取決於最後一個 I/O 作業,而不是下一次寫入的位置。 如果開啟以供附加的檔案上尚未發生任何 I/O 作業,該檔案的位置是檔案的開頭。

對於以文字模式開啟的資料流程, fseek_fseeki64 使用有限,因為歸位字元換行字元轉譯可能會導致 fseek_fseeki64 產生非預期的結果。 保證在文字模式中開啟資料流程的唯 fseek 一和 _fseeki64 作業如下:

  • 相對於任何原點值,位移為 0 的搜尋。

  • 使用 時或使用 _fseeki64_ftelli64 時,使用 時 fseek ,從 呼叫 ftell 傳回的位移值,從 檔案開頭搜尋 。

此外,在文字模式中,Ctrl+Z 會在輸入時被解譯成檔案結尾字元。 在檔案開啟供讀取/寫入時,fopen 和所有相關的常式檢查檔案結尾是否有 CTRL+Z,並在可能時將它移除。 因為使用 和 或 和 的組合 fseek ,在以 CTRL+Z 結尾的檔案內移動,可能會導致 fseek_fseeki64 行為不當接近檔案 _ftelli64 結尾。 _fseeki64ftell

當 CRT 開啟開頭為 Byte Order Mark (BOM) 的檔案時,檔案指標會放在 BOM 後面。 (也就是說,它位於檔案實際內容的開頭。 如果您必須移至 fseek 檔案的開頭,請使用 ftell 來取得初始位置,然後 fseek 移至該位置,而不是位置 0。

此函式於執行期間鎖定其他執行緒,因此為安全執行緒。 如需非鎖定版本,請參閱 _fseek_nolock_fseeki64_nolock

根據預設,此函式的全域狀態會限定于應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。

需求

函式 必要的標頭
fseek <stdio.h>
_fseeki64 <stdio.h>

如需相容性詳細資訊,請參閱相容性

範例

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

另請參閱

資料流 I/O
fopen, _wfopen
ftell, _ftelli64
_lseek, _lseeki64
rewind