linux lseek函数怎么用

linux lseek函数怎么用,第1张

Linux的lseek函数用来控制一个打开的文件的读写位置,它的函数原型如下:

off_t lseek(int fildes,off_t offset ,int whence)

参数的用法:fildes参数为一个已打开的文件描述符;参数offset为读写位置的位移数,这个位移数是根据参数whence来确定的;whence参数分为下列三种:

SEEK_SET:表示offset用来直接设置读写位置。

SEEK_CUR:表示以目前的读写位置往后增加offset个位移量。

SEEK_END:表示将读写位置指向文件尾后再增加offset个位移量。

当whence值为SEEK_CUR或SEEK_END时,参数offet允许负值出现。当lseek调用成功时返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno会存放错误代码。下面是几个使用示例:

将读写位置移到文件开头:lseek(myfile, 0, SEEK_SET)

将读写位置移到文件尾:lseek(myfile, 0, SEEK_END)

想要取得目前文件位置:off_t cur=lseek(myfile, 0, SEEK_CUR)

注意:使用lseek函数需要包含以下头文件:

#include <sys/types.h>

#include <unistd.h>

函数名:

lseek

能:

移动文件读/写指针

法:

long

lseek(int

handle,

long

offset,

int

fromwhere)

所有打开的文件都有一个当前文件偏移量(current

file

offset),以下简称为

cfo。cfo

通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于

cfo,并且使

cfo

增大,增量为读写的字节数。文件被打开时,cfo

会被初始化为

0,除非使用了

O_APPEND

使用

lseek

函数可以改变文件的

cfo

lseek

的以下用法返回当前的偏移量:

off_t

currpos

currpos

=

lseek(fd,

0,

SEEK_CUR)

这个技巧也可用于判断我们是否可以改变某个文件的偏移量。如果参数

fd(文件描述符)指定的是

pipe(管道)、FIFO

或者

socket,lseek

返回

-1

并且置

errno

ESPIPE。

对于普通文件(regular

file),cfo

是一个非负整数。但对于特殊设备,cfo

有可能是负数。因此,我们不能简单地测试

lseek

的返回值是否小于

0

来判断

lseek

成功与否,而应该测试

lseek

的返回值是否等于

-1

来判断

lseek

成功与否。

lseek

仅将

cfo

保存于内核中,不会导致任何

I/O

操作。这个

cfo

将被用于之后的读写操作。

如果

offset

比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的

0

表示。空洞是否占用硬盘空间是由文件系统(file

system)决定的。

编辑本段

程序例

#include

#include

#include

#include

#include

#include

int

main(void)

{

int

handle

char

msg[]

=

"This

is

a

test"

char

ch

/*

create

a

file

*/

handle

=

open("TEST.$$$",

O_CREAT

|

O_RDWR,

S_IREAD

|

S_IWRITE)

/*

write

some

data

to

the

file

*/

write(handle,

msg,

strlen(msg))

/*

seek

to

the

begining

of

the

file

*/

lseek(handle,

0L,

SEEK_SET)

/*

reads

chars

from

the

file

until

we

hit

EOF

*/

do

{

read(handle,

&ch,

1)

printf("%c",

ch)

}

while

(!eof(handle))

close(handle)

return

0

}

追问:

如果

offset

比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的

0

表示。空洞是否占用硬盘空间是由文件系统(file

system)决定的。

还是没有回答返回值啊

追答:

返回值为0

空洞都被0填充

思路是这样的。

我想你的意思是说在文件中有两份同样的数据,一份在前面未排序,一会在后面,排序

方法很简单。

先移至末尾,会吧,这个简单

然后利用tell函数求出文件长度(在末尾时候的偏移就是文件长度)

除以2的值就是要移动去的地方,再移动到文件的中间

即可


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/23721.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-02-16
下一篇2023-02-16

发表评论

登录后才能评论

评论列表(0条)

    保存