Linux开发:lseek()函数和fseek()函数的使用详解

2024-06-23 10:41:54 浏览数 (1)

lseek定义

代码语言:javascript复制
// 头文件
#include <sys/types.h>
#include <unistd.h>

// 函数定义
off_t lseek(int fd, off_t offset,int whence);

lseek 是一个在 Unix 和类 Unix 操作系统中广泛使用的系统调用,用于重新定位文件描述符指向的文件内的偏移量。

当我们打开一个文件时,需要一个读写位置,一般打开时这个读写位置指向文件的开头,而 lseek 用来控制文件的读写位置这个函数允许程序在文件中向前或向后移动读写指针,而不需要实际读取或写入数据,在处理大型文件或需要随机访问文件时非常有用。

参数说明:

  • fd:文件描述符,是一个非负整数,表示要操作的文件。
  • offset:偏移量,表示从whence指定的位置开始移动的字节数。它可以是正数(向前移动),负数(向后移动),或者0(在whence指定的位置)。
  • whence:指定offset的起始位置,可以是以下三个值之一:
    • SEEK_SET:文件的开头,offset从文件开头计算。
    • SEEK_CUR:当前位置,offset从当前文件位置计算。
    • SEEK_END:文件的末尾,offset从文件末尾计算。
    • whence 值为 SEEK_CURSEEK_END 时, 参数 offset 允许负值的出现.

返回值:

  • 成功时,lseek返回新的文件偏移量,即从文件开头到当前位置的字节数。
  • 失败时,返回 (off_t)-1,并设置errno以指示错误。

使用特例

  • lseek(int fd, 0, SEEK_SET) :读写位置移到文件开头
  • lseek(int fd, 0, SEEK_END) :读写位置移到文件尾
  • lseek(int fd, 0, SEEK_CUR) :获取当前文件的读写位置

使用lseek时需要注意的几点:

  • lseek不会改变文件的实际内容,只改变文件描述符的内部偏移量。
  • 如果lseek用于输出文件描述符,并且偏移量超出了当前文件的大小,文件大小将被扩展到新的偏移量。
  • 某些文件类型(如管道、设备文件)可能不支持lseek操作。

lseek是进行高效文件I/O操作的重要工具,特别是在需要随机访问文件数据时。

fseek定义

代码语言:javascript复制
// 头文件
#include <stdio.h>

// 函数定义
int fseek (FILE *stream, long offset, int whence);

fseek 是 C 语言标准库中的一个函数,用于在流(通常是文件)中设置文件位置指针。它与 lseek 不同,fseek 是针对流的,而 lseek 是针对文件描述符的。fseek 通常用于 FILE* 指针,这是 C 标准 I/O 库中使用的文件流类型。

参数说明:

  • stream:指向 FILE 结构的指针,表示要操作的流。
  • offset:偏移量,表示从 whence 指定的位置开始移动的字符数。
  • whence:指定 offset 的起始位置,可以是以下三个宏之一:
    • SEEK_SET:文件的开头,offset 从文件开头计算。
    • SEEK_CUR:当前位置,offset 从当前文件位置计算。
    • SEEK_END:文件的末尾,offset 从文件末尾计算。

返回值:

  • 成功时,fseek 返回 0。
  • 失败时,返回非零值,并设置 errno 以指示错误。

使用 fseek 时的一些注意事项:

  • fseek 只能用于可以随机访问的流,比如磁盘上的文件。对于某些类型的流(如标准输入、输出和错误流),fseek 可能不可用。
  • fseek 通常与 ftell(返回当前文件位置指针)和 rewind(将文件位置指针重置为文件开头)一起使用。
  • fseek 操作可能会失败,例如当 stream 是以文本模式打开的,且平台不支持随机访问文本文件时。
  • fseek 通常用于二进制文件,因为文本文件可能包含特定于平台的换行符转换,这可能会影响文件的实际大小。

fseek 是进行文件随机访问操作的重要函数,允许程序在文件中快速移动到不同的位置,而不必顺序读取或写入数据。

0 人点赞