名稱空間
變體
操作

fseek

來自 cppreference.com
< c‎ | io
 
 
檔案輸入/輸出
型別和物件
        
函式
檔案訪問
(C95)
非格式化輸入/輸出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

格式化輸入
 
定義於標頭檔案 <stdio.h>
int fseek( FILE* stream, long offset, int origin );
#define SEEK_SET    /* unspecified */

#define SEEK_CUR    /* unspecified */

#define SEEK_END    /* unspecified */

將檔案流 stream 的檔案位置指示器設定為 offset 指向的值。

如果 stream 以二進位制模式開啟,新位置是從檔案開頭算起 offset 位元組的精確位置,如果 originSEEK_SET;如果 originSEEK_CUR,則從當前檔案位置算起;如果 originSEEK_END,則從檔案末尾算起。二進位制流不要求支援 SEEK_END,特別是當輸出額外的空位元組時。

如果 stream 以文字模式開啟,offset 唯一支援的值是零(適用於任何 origin),以及之前對與同一檔案關聯的流呼叫 ftell 返回的值(僅適用於 originSEEK_SET)。

如果 stream 是寬定向的,則文字和二進位制流的限制都適用(ftell 的結果允許與 SEEK_SET 一起使用,零偏移量允許從 SEEK_SETSEEK_CUR 算起,但不允許從 SEEK_END 算起)。

除了更改檔案位置指示器,fseek 還會撤銷 ungetc 的效果,並清除檔案結束狀態(如果適用)。

如果發生讀寫錯誤,流的錯誤指示器(ferror)將被設定,檔案位置不受影響。

目錄

[編輯] 引數

stream - 要修改的檔案流
相對於 origin 移動的字元數 - offset
origin - 要將 offset 新增到的位置。它可以是以下值之一:SEEK_SETSEEK_CURSEEK_END

[編輯] 返回值

成功時返回 0,否則返回非零值。

[編輯] 注意

在寬流中尋找到非結束位置後,下次呼叫任何輸出函式可能會使檔案的其餘部分未定義,例如,透過輸出不同長度的多位元組序列。

對於文字流,offset 的唯一有效值是 0(適用於任何 origin)和之前呼叫 ftell 返回的值(僅適用於 SEEK_SET)。

POSIX 允許在檔案現有末尾之外進行定位。如果在這次定位之後執行輸出,則從間隙中的任何讀取都將返回零位元組。在檔案系統支援的情況下,這會建立一個**稀疏檔案**。

POSIX 還要求如果存在任何未寫入的資料,fseek 首先執行 fflush(但移位狀態是否恢復是實現定義的)。

POSIX 規定,fseek 在錯誤時應返回 -1,並設定 errno 來指示錯誤。

在 Windows 上,_fseeki64 可用於處理大於 2 GiB 的檔案。

[編輯] 示例

帶錯誤檢查的 fseek

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    // Prepare an array of double values.
    #define SIZE 5
    double A[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0};
 
    // Write array to a file.
    FILE * fp = fopen("test.bin", "wb");
    fwrite(A, sizeof(double), SIZE, fp);
    fclose (fp);
 
    // Read the double values into array B.
    double B[SIZE];
    fp = fopen("test.bin", "rb");
 
    // Set the file position indicator in front of third double value.
    if (fseek(fp, sizeof(double) * 2L, SEEK_SET) != 0)
    {
        fprintf(stderr, "fseek() failed in file %s at line # %d\n",
                __FILE__, __LINE__ - 2);
        fclose(fp);
        return EXIT_FAILURE;
    }
 
    int ret_code = fread(B, sizeof(double), 1, fp); // reads one double value
    printf("ret_code == %d\n", ret_code);           // prints the number of values read
    printf("B[0] == %.1f\n", B[0]);                 // prints one value
 
    fclose(fp);
    return EXIT_SUCCESS;
}

可能的輸出

ret_code == 1
B[0] == 3.0

[編輯] 參考

  • C23 標準 (ISO/IEC 9899:2024)
  • 7.23.9.2 fseek 函式 (p: TBD)
  • C17 標準 (ISO/IEC 9899:2018)
  • 7.21.9.2 fseek 函式 (p: 245)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.21.9.2 fseek 函式 (p: 336-337)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.19.9.2 fseek 函式 (p: 302-303)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.9.9.2 fseek 函式

[編輯] 參見

將檔案位置指示器移動到檔案中特定位置
(function) [編輯]
獲取檔案位置指示器
(function) [編輯]
返回當前檔案位置指示器
(function) [編輯]
將檔案位置指示器移動到檔案開頭
(function) [編輯]