1. 程式人生 > >(十)lseek函式的介紹和使用

(十)lseek函式的介紹和使用


  每個開啟的檔案都記錄著當前讀寫位置,開啟檔案時讀寫位置是0,表示檔案開頭,通常讀寫多少個位元組就會將讀寫位置往後移多少個位元組。但是有一個例外,如果以O_APPEND方式開啟,每次寫操作都會在檔案末尾追加資料,然後將讀寫位置移到新的檔案末尾。lseek和標準I/O庫的fseek函式類似,可以移動當前讀寫位置(或者叫偏移量)。

#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);


  引數offset和whence的含義和fseek函式完全相同。只不過第一個引數換成了檔案描述符。和fseek一樣,偏移量允許超過檔案末尾

,這種情況下對該檔案的下一次寫操作將延長檔案,中間空洞的部分讀出來都是0。
  若lseek成功執行,則返回新的偏移量,因此可用以下方法確定一個開啟檔案的當前偏移量:

off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);


  這種方法也可用來確定檔案或裝置是否可以設定偏移量,常規檔案都可以設定偏移量,而裝置一般是不可以設定偏移量的。如果裝置不支援lseek,則lseek返回-1,並將errno設定為ESPIPE。注意fseek和lseek在返回值上有細微的差別,fseek成功時返回0失敗時返回-1,要返回當前偏移量需呼叫ftell而lseek成功時返回當前偏移量失敗時返回-1。


一個小例子:(先要建立一個abc檔案)

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int fd = open("abc",O_RDWR);
    if(fd < 0)
    {
        perror("open abc"
); exit(-1); } //拓展檔案大小,用od -tcx abc命令檢視結果 lseek(fd, 0X1000,SEEK_SET); write(fd, "a", 1); //用lseek獲取檔案大小 printf("abc's size:%d\n",(int)lseek(fd,0,SEEK_END)); close(fd); return 0; }