1. 程式人生 > >02_檔案I/O:lseek

02_檔案I/O:lseek

檔案I/O:lseek

1、lseek

lseek()API簡介: 在這裡插入圖片描述 對於每個開啟的檔案,系統核心會記錄其檔案偏移量,有時也將檔案偏移量稱為讀寫偏移量或指標。檔案偏移量是指執行下一個 read()或 write()操作的檔案起始位置,會以相對於檔案頭部起始點的檔案當前位置來表示。檔案第一個位元組的偏移量為 0。 offset 引數指定了一個以位元組為單位的數值。 whence 引數則表明應參照哪個基點來解釋 offset 引數,應為下列其中之一: SEEK_SET:將檔案偏移量設定為從檔案頭部起始點開始的 offset 個位元組。 SEEK_CUR:相對於當前檔案偏移量,將檔案偏移量調整 offset 個位元組1。 SEEK_END

:將檔案偏移量設定為起始於檔案尾部的 offset 個位元組。也就是說, offset 引數應該從檔案最後一個位元組之後的下一個位元組算起。

2、程式示例

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

#define MAX_READ 20
char buf[MAX_READ+1];

int main(int argc, char
**argv) { int fd = -1; char wr_buf[20] = "I love Linux"; fd = open("./test.txt", O_RDWR | O_CREAT, 0666); int ret = write(fd,wr_buf,strlen(wr_buf)); if(ret > 0) { printf("write success\n"); } else { printf("write error\n"); } /* close(fd); fd = open("./test.txt", O_RDWR); */
lseek(fd,-strlen(wr_buf),SEEK_END); read(fd,buf,strlen(wr_buf)); printf("The input is %s\n",buf); close(fd); return 0; }

輸出結果為: 在這裡插入圖片描述 此程式中向檔案寫入內容之後,指標指向末尾,使用lseek函式使得指標重新回到起點,再開始讀出內容;

3、檔案空洞

如果程式的檔案偏移量已然跨越了檔案結尾,然後再執行 I/O 操作,將會發生什麼情況? read()呼叫將返回 0,表示檔案結尾。有點令人驚訝的是, write()函式可以在檔案結尾後的任意位置寫入資料。從檔案結尾後到新寫入資料間的這段空間被稱為檔案空洞。 從程式設計角度看,檔案空洞中是存在位元組的,讀取空洞將返回以 0(空位元組)填充的緩衝區。檔案空洞不佔用任何磁碟空間。直到後續某個時點,在檔案空洞中寫入了資料,檔案系統才會為之分配磁碟塊。