使用文件读写指针获取文件长度
我们会用到lseek系统调用, 来移动文件读写指针.
man lseek # 在shell中使用该命令获取函数的信息, 如下
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
具体的操作流程如下
- 调用
lseek并将其的第二个参数offset和第三个参数whence分别设置为__0__与__SEEK_END__, 将文件读写指针移动到文件的结尾处 - 同上, 第二次调用
lseek, 只是whence设置为__SEEK_CUR__; 并将计算返回的偏移量赋值给len(实际在这里目的已经达成, 即获取到了文件的长度) - 第三次调用
lseek, 把whence设置为__SEEK_SET__, 将读写指针移动回文件开始处
graph TD;
A[调用lseek] -- offset: 0, whence: SEEK_END --> B[将文件读写指针移动到文件结尾处]
B -- 返回文件指针位置 --> C[调用lseek]
C -- offset: 0, whence: SEEK_CUR --> D[获取文件长度并赋值给len]
D -- 返回文件指针位置 --> E[调用lseek]
E -- offset: 0, whence: SEEK_SET --> F[将文件读写指针移动回文件开始处]
实例:
int len;
/*获取文件长度并保持文件读写指针在文件开始处*/
if (lseek(fd, 0, SEEK_END) == -1) {
my_err("lseek", __LINE__);
/* __LINE__ 是一个预定义宏,表示当前代码所在的行号,用于获取错误发生的位置 */
}
if ((len = lseek(fd, 0, SEEK_CUR)) == -1) { // 前一个lseek调用已经将读写指针指向文件末尾
my_err("lseek", __LINE__);
}
if ((lseek(fd, 0, SEEK_SET)) == -1) { // 指向文件开头
my_err("lseek", __LINE__);
}