新聞中心
Linux操作系統(tǒng)一直以來(lái)備受程序員們的喜愛(ài),其穩(wěn)定性和高效性都是其他操作系統(tǒng)無(wú)法比擬的。在Linux C編程中,lseek函數(shù)是一個(gè)非常重要的函數(shù),經(jīng)常被用來(lái)控制文件的讀寫(xiě)位置。在本文中,我們將深入了解lseek函數(shù),包括其用法、參數(shù)和返回值等等。

目前創(chuàng)新互聯(lián)已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、烏蘇網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
一、lseek函數(shù)的概述
lseek函數(shù)的作用是設(shè)置文件讀寫(xiě)指針的位置。其定義如下:
“`
off_t lseek(int fd, off_t offset, int whence);
“`
其中,fd是文件的描述符,offset是文件讀寫(xiě)指針的偏移量,whence表示偏移量的基準(zhǔn)點(diǎn),取值為SEEK_SET,SEEK_CUR和SEEK_END。lseek函數(shù)的返回值是設(shè)置后文件讀寫(xiě)指針的絕對(duì)位置。
在使用lseek函數(shù)時(shí),需要注意以下幾個(gè)方面:
1. 文件描述符fd必須是一個(gè)打開(kāi)的文件描述符;
2. offset必須是一個(gè)long類(lèi)型的值,在32位系統(tǒng)中為4字節(jié),在64位系統(tǒng)中為8字節(jié);
3. whence的取值決定了offset的解釋方式,即offset對(duì)應(yīng)于文件的開(kāi)頭、當(dāng)前位置還是結(jié)尾處。
二、使用lseek函數(shù)控制文件讀寫(xiě)指針
lseek函數(shù)可以用來(lái)改變文件讀/寫(xiě)指針的位置,該函數(shù)的實(shí)現(xiàn)方式不僅可以用來(lái)進(jìn)行文件偏移量的定位,同樣可以用來(lái)添加或刪除數(shù)據(jù)。Linux中,基本上所有的IO函數(shù)都支持文件讀寫(xiě)指針的概念。文件讀寫(xiě)指針可理解為文件偏移量,初始值通常是0,也就是文件的開(kāi)頭處。后續(xù)讀寫(xiě)會(huì)改變其位置。
以下是演示如何使用lseek函數(shù)實(shí)現(xiàn)向文件末尾添加數(shù)據(jù)的例子:
“`
#include
#include
#include
#include
#include
int mn()
{
int fd = open(“test.txt”, O_WRON | O_APPEND);
if (fd
perror(“open fled”);
exit(1);
}
char buf[] = “hello world!”;
size_t len = strlen(buf);
lseek(fd, 0, SEEK_END);
write(fd, buf, len);
close(fd);
return 0;
}
“`
在以上代碼中,打開(kāi)test.txt文件并將文件描述符保存在fd中。然后,使用lseek函數(shù)將讀寫(xiě)指針移動(dòng)到文件結(jié)尾處(SEEK_END),其實(shí)際值應(yīng)該為0,因?yàn)榇藭r(shí)文件為空。使用write函數(shù)將數(shù)據(jù)寫(xiě)入文件,其中,buf數(shù)組是寫(xiě)入的數(shù)據(jù)內(nèi)容。關(guān)閉文件。
三、實(shí)現(xiàn)模擬tl命令的例子
為了進(jìn)一步理解lseek函數(shù)的使用,我們可以通過(guò)模擬tl命令的方式來(lái)更好地理解。以下是一個(gè)讀取文件末尾10行數(shù)據(jù)并輸出的例子:
“`
#include
#include
#include
#include
#define BUFFSIZE 1024
int mn()
{
int fd = open(“test.txt”, O_RDON);
if (fd
perror(“open fled”);
exit(1);
}
char buf[BUFFSIZE];
int n;
off_t offset;
// 計(jì)算文件總字節(jié)數(shù)并移動(dòng)指針到文件末尾處
offset = lseek(fd, 0, SEEK_END);
while (1) {
if (offset
// 如果字節(jié)數(shù)小于緩沖區(qū)大小,則直接讀取文件
offset = lseek(fd, 0, SEEK_SET);
read(fd, buf, offset);
write(STDOUT_FILENO, buf, offset);
break;
} else {
// 如果字節(jié)數(shù)大于緩沖區(qū)大小,則讀取緩沖區(qū)
offset = lseek(fd, -BUFFSIZE, SEEK_CUR);
read(fd, buf, BUFFSIZE);
for (n = BUFFSIZE-1; n >= 0; n–) {
// 找到換行符位置并輸出之后的部分
if (buf[n] == ‘\n’) {
write(STDOUT_FILENO, buf+n+1, BUFFSIZE-n-1);
break;
}
}
if (n
// 如果沒(méi)有找到換行符,則全部輸出
write(STDOUT_FILENO, buf, BUFFSIZE);
}
}
}
close(fd);
return 0;
}
“`
在以上代碼中,我們打開(kāi)test.txt文件并將讀寫(xiě)模式設(shè)置為只讀模式。使用BUFFSIZE大小的緩沖區(qū)來(lái)緩存讀取的數(shù)據(jù)。使用lseek函數(shù)將文件指針移動(dòng)到文件末尾處,保存偏移量值到offset變量中。
如果文件大小小于BUFFSIZE,直接從文件頭部讀取文件并輸出即可。如果文件大小大于等于BUFFSIZE,通過(guò)lseek函數(shù)來(lái)控制指針位置,從后向前讀取數(shù)據(jù),找到換行符(’\n’)的位置,然后輸出之后的部分即可。
通過(guò)以上例子,我們可以深入了解到lseek函數(shù)的使用,尤其在處理大文件時(shí),性能的提升可以明顯。同時(shí),也可以理解到文件讀寫(xiě)指針的重要性,在文件讀寫(xiě)操作中是一個(gè)不可避免的問(wèn)題。
相關(guān)問(wèn)題拓展閱讀:
- opentext和closetexteco
- linux編程里有這么一句if (lseek(STDIN_FILENO, 0, SEEK_CUR) == -1 ),請(qǐng)問(wèn)是什么意思?
- Linux 怎樣下用c語(yǔ)言輸出文件內(nèi)容
opentext和closetexteco
前言
一、open與fopen、close與fclose使用區(qū)別
二、read與fread、write與fwrite使用區(qū)別
三、lseek與fseek使用
四、creat、fgetc、fputc、feof使用
前埋派言
這是在學(xué)習(xí)Linux文件系統(tǒng)編程時(shí)記錄的學(xué)習(xí)心得、
從來(lái)源臘信的角度看,open等函數(shù)和fopen等函數(shù)有所不同:
open是LUNIX系統(tǒng)調(diào)用函數(shù),返回文件描述符(File Descriptor),它是文件在文件描述符表里的索引。
fopen是ANSIC標(biāo)準(zhǔn)中的C語(yǔ)言庫(kù)函數(shù),在不同的系統(tǒng)中應(yīng)該調(diào)用不同的內(nèi)核api。返回的是一個(gè)指向文件結(jié)構(gòu)的指針。
從移植角度:fopen是C標(biāo)準(zhǔn)函數(shù),有良好的移植性;而open是LUNIX系統(tǒng)調(diào)用,移植性有限。如windows下相似的功能使用API函數(shù)`CreateFile`。
從適用范圍:open返回文件描述符,LUNIX下的一切設(shè)備都是以文件的形式操作。如網(wǎng)絡(luò)套接字、硬件設(shè)備等。當(dāng)然包括操作普通正規(guī)文件(Regular File)。fopen是用來(lái)操縱普通正規(guī)文件(Regular File)
從緩沖角度:open無(wú)緩沖,fopen有緩沖。緩沖文件系統(tǒng)是借助文件結(jié)構(gòu)體指針來(lái)對(duì)文件進(jìn)行管理,通過(guò)文件指針來(lái)對(duì)文件進(jìn)行訪(fǎng)問(wèn)。緩沖就是先對(duì)緩沖區(qū)操作,然后再對(duì)文件操作。比如執(zhí)行寫(xiě)文件的操作時(shí),先將數(shù)據(jù)寫(xiě)入內(nèi)存“緩沖區(qū)”,待內(nèi)存“緩沖區(qū)”裝滿(mǎn)再寫(xiě)入文件。非緩沖文件系統(tǒng)依賴(lài)于操作系統(tǒng),通過(guò)操作系統(tǒng)的功能對(duì)文件進(jìn)行讀寫(xiě),是系統(tǒng)級(jí)的輸入輸出
一、open與fopen、close與fclose使用區(qū)別
open和close搭配使用,fopen和fclose搭配使用
int open(const char *pathname, int flags);
FILE *fopen(const char *path, const char *mode);
open函數(shù)輪液輪返回文件描述符號(hào),是文件的索引,fopen返回文件的指針,通過(guò)文件指針來(lái)訪(fǎng)問(wèn)
int close(int fd);
int fclose(FILE *fp);
二者使用方式大同小異
二、read與fread、write與fwrite使用區(qū)別
ssize_t read(int fd, void *buf, size_t count);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ssize_t write(int fd, const void *buf, size_t count);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
ptr就是緩沖區(qū),fwrite從緩沖區(qū)數(shù)據(jù)寫(xiě)入文件,fread從文件讀到緩沖區(qū)
read、write返回值是讀寫(xiě)的字節(jié)大小,fread、fwrite返回值取決于第三個(gè)參數(shù):讀寫(xiě)次數(shù)
三、lseek與fseek使用
off_t lseek(int fd, off_t offset, int whence);
int fseek(FILE *stream, long offset, int whence);
二者使用相同,int whence有三種位置:
SEEK_SET光標(biāo)指向頭部,SEEK_CUR光標(biāo)指向當(dāng)前位置,SEEK_END光標(biāo)指向尾部
offset相對(duì)于位置的偏移量,偏移量負(fù)數(shù)往前移,正數(shù)往后移
lseek(fd,0,SEEK_END)利用它的返回值,計(jì)算文件大小
四、creat、fgetc、fputc、feof使用
int creat(const char*pathname,mode_t mode)
絕對(duì)路徑模式:宏表示數(shù)字
S_IRUSR可讀
S_IWUSR可寫(xiě)
S_IXUSR可執(zhí)行
S_IRWXU可讀、寫(xiě)、執(zhí)行
int fputc(int c, FILE *stream);
寫(xiě)入一個(gè)字符到fp文件流中,寫(xiě)多個(gè)字符可采用循環(huán)一個(gè)一個(gè)寫(xiě)
int fgetc(FILE *stream);
從文件中得到一個(gè)字符,可以循環(huán)一個(gè)一個(gè)得到字符,配合feof
int feof(FILE *stream);
判斷是否到達(dá)文件流末端,未到達(dá)末端返回值是0,到達(dá)末端返回值是非0
do
{
c = fgetc(fp);
if( feof(fp) )
{
break ;
}
printf(“%c”, c);
}while(1);
復(fù)制
參考文章:
linux
c語(yǔ)言
Linux程序設(shè)計(jì):文件I/O系統(tǒng)調(diào)用、open函數(shù)、creat函數(shù)
258閱讀·0評(píng)論·2點(diǎn)贊
2023年9月3日
文件的順序讀寫(xiě)和隨機(jī)讀寫(xiě),fgetc、fgets、fputc、fputs、fscanf、fprintf、fread、fwrite等等函數(shù)的介紹
367閱讀·0評(píng)論·2點(diǎn)贊
2023年7月22日
Linux——操作文件的系統(tǒng)調(diào)用(open、write、read、close)
245閱讀·0評(píng)論·0點(diǎn)贊
2023年10月15日
Linux應(yīng)用編程之fopen()、fclose()、fread()、fwrite()函數(shù)
2882閱讀·0評(píng)論·2點(diǎn)贊
2023年4月22日
Linux文件系統(tǒng)【02】creat,open,close,read,write,lseek;ioctl,fcntl,dup,dup2,自定義創(chuàng)建文件命令
542閱讀·0評(píng)論·0點(diǎn)贊
2023年3月21日
Linux的系統(tǒng)調(diào)用open,write,read,close,及相關(guān)總結(jié)
880閱讀·0評(píng)論·0點(diǎn)贊
2023年4月20日
linux 系統(tǒng)調(diào)用open和close介紹以及作用和調(diào)用關(guān)系的理解
451閱讀·0評(píng)論·0點(diǎn)贊
2023年10月11日
fopen() 與 CreateFile() 操作文件
1209閱讀·0評(píng)論·0點(diǎn)贊
2023年11月14日
文件描述符,Linux操作系統(tǒng)文件的系統(tǒng)調(diào)用 open read write close
734閱讀·0評(píng)論·0點(diǎn)贊
2023年5月17日
【Linux】文件操作(open/read/write/close)、系統(tǒng)調(diào)用與庫(kù)函數(shù)的區(qū)別
4273閱讀·0評(píng)論·5點(diǎn)贊
2023年5月19日
Linux 1.文件編程(open、creat、write、read、lseek)
412閱讀·0評(píng)論·0點(diǎn)贊
2023年8月16日
Linux文件操作函數(shù)open、read、 write、lseek、ftruncate(linuxC編程篇)
1003閱讀·1評(píng)論·2點(diǎn)贊
2023年5月17日
Centos安裝python遇到ln: failed to create symbolic link ‘/usr/bin/python’: File exists
2365閱讀·0評(píng)論·2點(diǎn)贊
2023年9月9日
【Linux】文件操作函數(shù) fopen、fwrite、fread、fclose、fseek 與 open、write、read、close、lseek
482閱讀·0評(píng)論·0點(diǎn)贊
2023年8月10日
open、fopen與freopen
1317閱讀·0評(píng)論·0點(diǎn)贊
2023年11月18日
linux下 c語(yǔ)言 用write open二進(jìn)制寫(xiě)文件,fread與read的區(qū)別—open和fopen的區(qū)別–fread函數(shù)和fwrite函數(shù)…
174閱讀·0評(píng)論·0點(diǎn)贊
2023年5月17日
LinuxC open() umask close() read() write() lseek() fcntl() ioctl() mmap() ext2 stat() dup() dup2()
49閱讀·0評(píng)論·0點(diǎn)贊
2023年8月18日
Linux文件系統(tǒng)(四)—— open & read & write & poll
2023閱讀·0評(píng)論·0點(diǎn)贊
2023年12月1日
python3 文件操作(列出、創(chuàng)建、刪除、復(fù)制) 文件打開(kāi)模式
1037閱讀·2評(píng)論·0點(diǎn)贊
2023年11月6日
去首頁(yè)
看看更多熱門(mén)內(nèi)容
linux編程里有這么一句if (lseek(STDIN_FILENO, 0, SEEK_CUR) == -1 ),請(qǐng)問(wèn)是什么意思?
STDIN_FILENO 就是 stdin,但是,旦春轎 stdin 是對(duì)應(yīng) FILE *, STDIN_FILENO 是 輸入流描述符,或文件號(hào),通常是 0。
STDIN_FILENO 與read/write 相配。
SEEK_CUR — 偏移位置從文件指針當(dāng)前模肆位置開(kāi)始計(jì)算。
參數(shù)2你給的 0,是偏移量。
怎樣才能輸出seek OK呢 — 你試試 用管道 的方法,數(shù)據(jù)從管道 輸入,森型相當(dāng)于 文件轉(zhuǎn)向。
( pipe, socket,FIFO 返回 ESPIPE)
Linux 怎樣下用c語(yǔ)言輸出文件內(nèi)容
#include 巧碰
int main(int argc,char**argv)
{
FILE* pFIle = fopen(“a.c”,”r”頌慎);
if(pFIle){
fseek(pFile,10,SEEK_SET);
while(!feof(pFile)) {
char c;
fread(&c,1,1,pFile);
printf(“野寬敬%c”,c);
}
fclose(pFile);
}
}
linux c lseek的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux c lseek,深入了解Linux C編程中的lseek函數(shù),opentext和closetexteco,linux編程里有這么一句if (lseek(STDIN_FILENO, 0, SEEK_CUR) == -1 ),請(qǐng)問(wèn)是什么意思?,Linux 怎樣下用c語(yǔ)言輸出文件內(nèi)容的信息別忘了在本站進(jìn)行查找喔。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專(zhuān)注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開(kāi)發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶(hù)提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)成都老牌IDC服務(wù)商,專(zhuān)注四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,可選線(xiàn)路電信、移動(dòng)、聯(lián)通等。
文章題目:深入了解LinuxC編程中的lseek函數(shù)(linuxclseek)
標(biāo)題網(wǎng)址:http://m.5511xx.com/article/dhsodoh.html


咨詢(xún)
建站咨詢(xún)
