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。
備註
和 _fseeki64
函fseek
式會將與 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
作業如下:
此外,在文字模式中,Ctrl+Z 會在輸入時被解譯成檔案結尾字元。 在檔案開啟供讀取/寫入時,fopen
和所有相關的常式檢查檔案結尾是否有 CTRL+Z,並在可能時將它移除。 因為使用 和 或 和 的組合fseek
,在以 CTRL+Z 結尾的檔案內移動,可能會導致fseek
或_fseeki64
行為不當接近檔案_ftelli64
結尾。_fseeki64
ftell
當 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