02_檔案I/O:lseek
阿新 • • 發佈:2018-12-19
檔案I/O:lseek
1、lseek
lseek()API簡介: 對於每個開啟的檔案,系統核心會記錄其檔案偏移量,有時也將檔案偏移量稱為讀寫偏移量或指標。檔案偏移量是指執行下一個 read()或 write()操作的檔案起始位置,會以相對於檔案頭部起始點的檔案當前位置來表示。檔案第一個位元組的偏移量為 0。 offset 引數指定了一個以位元組為單位的數值。 whence 引數則表明應參照哪個基點來解釋 offset 引數,應為下列其中之一: SEEK_SET:將檔案偏移量設定為從檔案頭部起始點開始的 offset 個位元組。 SEEK_CUR:相對於當前檔案偏移量,將檔案偏移量調整 offset 個位元組1。 SEEK_END
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(空位元組)填充的緩衝區。檔案空洞不佔用任何磁碟空間。直到後續某個時點,在檔案空洞中寫入了資料,檔案系統才會為之分配磁碟塊。