lseek
Header Files
#include <sys/types>
#include <unistd.h>
Function Prototype
off_t lseek(int filedes, off_t offset, int whence)Function
可以讓你位移 Open file table 中的 current file offset 的位置,也就是更改你目前讀到哪裡
只有 offset 位移,沒有 I/O 操作
Parameters
filedes
要更改哪個 file descriptor 對應的 open file 物件
offset
要位移多少個 bytes
whence
指定偏移量是從哪裡開始算的
SEEK_SET: 相對於檔案開頭SEEK_CUR: 相對於當前位置SEEK_END: 相對於檔案結尾
Weird Things with lseek
1. 負偏移量 (Negative Offset)
用途:往回移動檔案指標
例如:lseek(fd, -10, SEEK_CUR) 從當前位置往前退 10 個位元組,或 lseek(fd, -100, SEEK_END) 移動到檔案結尾前 100 個位元組的位置。常用於重新讀取資料或從檔案尾端往前搜尋
2. 移動 0 位元組 (Seek 0 bytes)
用途:查詢當前檔案位置,不改變位置
lseek(fd, 0, SEEK_CUR) 的返回值就是當前檔案指標位置。這是獲取目前讀寫位置的標準方法,就像問系統”我現在在第幾個位元組?“
3. 超越檔案結尾 (Seek past EOF)
用途:創建稀疏檔案(有”洞”的檔案)
lseek(fd, 1000, SEEK_END) 移動到檔案結尾後 1000 位元組,然後寫入資料。中間的 1000 位元組成為”洞”—邏輯上存在但不佔實際磁碟空間,讀取時返回零值。用於創建大型檔案但節省空間