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_CUR
或SEEK_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
是进行文件随机访问操作的重要函数,允许程序在文件中快速移动到不同的位置,而不必顺序读取或写入数据。