在偏移量处从文件描述符读取/写入数据

16

我一直在使用read(2)write(2)函数,以文件描述符读写文件。

是否有类似的函数可以允许您在读取/写入时将偏移量放入文件中?

5个回答

29

pread/pwrite 函数可以接受文件偏移量:

ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);

9
对于多线程程序,pread()pwrite()更好,因为它们不会影响文件偏移量(这样多个线程可以从同一文件描述符读取,而无需任何锁定并且不会存在lseek()read()之间的竞争条件)。这个答案很棒!+1 - Thomas Perl
1
只需要一个系统调用! - Kevin Cox
这是我个人认为更好的答案。 - Jon Watte

16

是的。您可以在同一库中使用lseek函数。

然后,您可以相对于文件的开头、结尾或当前位置进行任何偏移量的查找。

不要被那个库页面所吓倒。这里有一些简单的使用示例,可能是大多数人所需要的所有内容:

lseek(fd, 0, SEEK_SET);   /* seek to start of file */
lseek(fd, 100, SEEK_SET); /* seek to offset 100 from the start */
lseek(fd, 0, SEEK_END);   /* seek to end of file (i.e. immediately after the last byte) */
lseek(fd, -1, SEEK_END);  /* seek to the last byte of the file */
lseek(fd, -10, SEEK_CUR); /* seek 10 bytes back from your current position in the file */
lseek(fd, 10, SEEK_CUR);  /* seek 10 bytes ahead of your current position in the file */

祝你好运!


6

1
“whence” 究竟是做什么的?我对它使用的 “holes” 和 “data” 这两个词有点困惑。数据指非零值,孔洞指零值吗? - zaloo
1
whence 控制偏移量相对于哪个位置。因此,如果您使用 SEEK_SET 请求 10 字节,则它将从文件开头开始的 10 字节。如果您随后使用 SEEK_CUR 请求 6 字节,则它将从文件开头开始的 16 字节。 - paddy
不用担心空洞和漏洞。那是处理在文件末尾寻找的情况。 - paddy

6

lseek() 函数能够帮助你实现文件定位。


12
我认为应该是使用 lseek,然后你就可以使用 lfind - paddy

2

是的,你可以使用lseek()函数:

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

lseek()函数根据指令whence,将与文件描述符fd相关联的打开文件的偏移量重新定位到参数offset,具体如下:

SEEK_SET

将偏移量设置为offset字节。

SEEK_CUR

将偏移量设置为当前位置加上offset字节。

SEEK_END

将偏移量设置为文件大小加上offset字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接