The C Programming Language(第 2 版) 笔记 / 8 UNIX 系统接口 / 8.4 随机访问(lseek)

本文详细介绍了系统调用lseek和标准库函数fseek的使用,它们允许程序员在文件中进行随机访问。lseek用于改变文件指针的位置,而不会实际读写数据,这在需要在文件尾部追加内容或者跳转到文件开头时非常有用。文章通过示例代码展示了如何使用lseek进行文件定位,并解释了各种参数的含义。fseek与lseek类似,但接受FILE*类型的参数。这两个函数使得文件可以被视为大数组,但可能影响访问速度。
摘要由CSDN通过智能技术生成

目录、参考文献


8.4 随机访问(lseek)

输入/输出通常是顺序进行的:每次调用 readwrite 进行读写的位置紧跟在前一次操作的位置之后
但是,有时候需要以任意顺序访问文件,系统调用 lseek 可以在文件中任意移动位置而不实际读写任何数据:

long lseek(int fd, long offset, int origin);

将文件描述符为 fd 的文件的当前位置设置为 offset,其中,offset 是相对于 origin 指定的位置而言的
随后进行的读写操作将从此位置开始,origin 的值可以为 012,分别用于指定 offset 从文件开始、从当前位置或从文件结束处开始算起
例如,为了向一个文件的尾部添加内容(在 UNIX shell 程序中使用重定向符 >> 或在系统调用 fopen 中使用参数 a
则在写操作之前必须使用下列系统调用找到文件的末尾:

lseek(fd, 0L, 2);

若要返回文件的开始处(即反绕),则可以使用下列调用:

lseek(fd, 0L, 0);

请注意,参数 0L 也可写为 (long)0,或仅仅写为 0,但是系统调用 lseek 的声明必须保持一致

使用 lseek 系统调用时,可以将文件视为一个大数组,其代价是访问速度会慢一些
例如,下面的函数将从文件的任意位置读入任意数目的字节,它返回读入的字节数,若发生错误,则返回 -1

#include "syscalls.h"

/*get: read n bytes from position pos */ 
int get(int fd, long pos, char *buf, int n) 
{ 
    if (lseek(fd, pos, 0) >= 0) /* get to pos */ 
        return read(fd, buf, n); 
    else 
        return -1; 
}

lseek 系统调用返回一个 long 类型的值,此值表示文件的新位置,若发生错误,则返回 -1
标准库函数 fseek 与系统调用 lseek 类似,所不同的是,前者的第一个参数是 FILE * 类型,且在发生错误时返回一个非 0


目录、参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值