fseek
定義於標頭檔案 <stdio.h> |
||
int fseek( FILE* stream, long offset, int origin ); |
||
#define SEEK_SET /* unspecified */ #define SEEK_CUR /* unspecified */ |
||
將檔案流 stream 的檔案位置指示器設定為 offset 指向的值。
如果 stream 以二進位制模式開啟,新位置是從檔案開頭算起 offset 位元組的精確位置,如果 origin 是 SEEK_SET;如果 origin 是 SEEK_CUR,則從當前檔案位置算起;如果 origin 是 SEEK_END,則從檔案末尾算起。二進位制流不要求支援 SEEK_END,特別是當輸出額外的空位元組時。
如果 stream 以文字模式開啟,offset 唯一支援的值是零(適用於任何 origin),以及之前對與同一檔案關聯的流呼叫 ftell 返回的值(僅適用於 origin 為 SEEK_SET)。
如果 stream 是寬定向的,則文字和二進位制流的限制都適用(ftell 的結果允許與 SEEK_SET 一起使用,零偏移量允許從 SEEK_SET 和 SEEK_CUR 算起,但不允許從 SEEK_END 算起)。
除了更改檔案位置指示器,fseek
還會撤銷 ungetc 的效果,並清除檔案結束狀態(如果適用)。
如果發生讀寫錯誤,流的錯誤指示器(ferror)將被設定,檔案位置不受影響。
目錄 |
[編輯] 引數
stream | - | 要修改的檔案流 |
相對於 origin 移動的字元數 | - | offset |
origin | - | 要將 offset 新增到的位置。它可以是以下值之一:SEEK_SET、SEEK_CUR、SEEK_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) | |
C++ documentation for fseek
|