1. 程式人生 > >lseek函式的簡單理解

lseek函式的簡單理解

lseek函式用於設定檔案偏移量

所有開啟的檔案都有一個當前檔案偏移量(current file offset),以下簡稱為 cfo。cfo 通常是一個非負整數,用於表明檔案開始處到檔案當前位置的位元組數。讀寫操作通常開始於 cfo,並且使 cfo 增大,增量為讀寫的位元組數。檔案被開啟時,cfo 會被初始化為 0,除非使用了O_APPEND 。

每個開啟的檔案都有一個與其相關聯的“當前檔案偏移量”(current file offset)。它通常是一個非負整數,用以度量從檔案開始處計算的位元組數。通常,讀寫操作都從當前檔案偏移量處開始,並使偏移量增加所讀寫的位元組數。按系統預設的情況,當開啟一個檔案時,除非制定O_APPEND選項,否則該偏移量被設定為0。

#include<unistd.h> off_t lseek(int filedes, off_t offset, int whence); 對引數offset 的解釋與引數whence的值有關。

若whence是SEEK_SET,則檔案偏移量設定為距檔案開始處 offset個位元組。 若whence是SEEK_CUR,則檔案偏移量設定為當前值加 offset,offset可為正或負。 若whence是SEEK_END,則檔案偏移量設定為檔案長度加 offset,offset可為正或負。 若lseek成功執行,則返回新的檔案偏移量,為此可以用下列方式確定開啟檔案的當前偏移量:

off_t currpos; currpos = lseek(fd, 0,SEEK_CUR); 這種方法也可用來確定所涉及的檔案是否可以設定偏移量。如果檔案描述符引用的是一個管道,FIFO或網路套接字,則lseek返回 -1,並將errno設定為ESPIPE。

檔案偏移量可以大於檔案的當前長度,在這種情況下,對該檔案的下一次寫將加長該檔案,並在檔案中構成一個空洞。位於檔案中但沒有寫過的位元組都被讀為0。

檔案中的空洞不要求在磁碟上佔用儲存區。當定位到超出檔案尾端之後寫時,對於新寫的資料需要分配磁碟塊,但是對於原檔案尾端和新開始位置之間的部分則不需要分配磁碟塊。