文件IO基础之lseek函数的理解

首先说一下lseek函数的原型

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

off_t —— 返回值,返回文件大小

fd —— 所需要操作的文件,为打开文件(open函数)的返回值(文件描述符)

offset —— 为文件指针位置(如果是获取文件大小,那么它就是终点。如果是读写文件内容,那么它就是起点)。其取值可为正数或者为负数,但whence参数为SEEK_SET时,它只能为正数

whence——文件指针位置的参考点。其为一个宏定义,分别有SEEK_SET(以文件头为参考点)、SEEK_CUR(以文件指针当前位置为参考点)、SEEK_END(以文件末尾为参考点)。

其函数有两个作用

1、计算文件大小

2、移动读写文件内容的起始位置

作用:1、计算文件大小

此函数的返回值则问文件大小;

而offset参数和whence参数的解释如下:

1、无论offset为多少,计算文件大小都是从文件开头开始计算。而offset参数只是表示要计算到哪个位置停止。

2、whence参数为参考点,下面以三种情况作为解释。

一、whence设置为SEEK_SET(以文件头为参考点)时,offset设置为100,那么文件计算就是从头计算到100这个位置的文件大小。注意,whence设置为SEEK_SET时,offset只能为正数

二、whence设置为SEEK_CUR(以文件指针当前位置为参考点),当offset设为正数则为SEEK_CUR+offset作为终点位置。当offset设为负数则为SEEK_CUR-offset作为终点位置。一般情况下,SEEK_CUR=0;

三、whence设置为SEEK_END(以文件末尾为参考点),当offset设为正数则为SEEK_END+offset作为终点位置。当offset设为负数则为SEEK_END-offset作为终点位置。

计算文件大小的总结

1、无论怎样,都是从文件头开始计算,我们只能决定结束地方

2、结束的地方通用公式:whence+(offset),当offset为负数就减

3、offset为正数就往参考点的右边加,比如文件总共100个字节,设置为SEEK_END(以文件末尾为参考点),那么offset设置为50时,其结束就到150的位置,就算超出源文件字符数也可,因为其为计算文件大小,能扩存。offset为负数就往参考点的左边减,比如offset设置为 -50 时,其结束就到50的位置。

4、注意,一定不能和读写文件内容搞混

作用:2、移动读写文件内容的起始位置

如果理解了计算文件大小定位的意思,这个也很好理解。

每个文件都有位置偏移量,也就是当前位置处于文件内容里面的哪个位置。其作用是为了让read函数和write函数从哪个位置开始读。打个比方,一条美食街,总共有100家美食店。那么lseek的函数意义就是让你从哪家店开始吃起,一直吃到美食街最后一家店。

whence参数为参考点,下面以三种情况作为解释。

一、whence设置为SEEK_SET(以文件头为参考点)时,offset设置为100,那么就是从100开始读写文件,直到读写到文件最后一个字符。注意,whence设置为SEEK_SET时,offset只能为正数

二、whence设置为SEEK_CUR(以文件指针当前位置为参考点),当offset设为正数则为SEEK_CUR+offset作为起始位置。当offset设为负数则为SEEK_CUR-offset作为起始位置。一般情况下,SEEK_CUR=0;

三、whence设置为SEEK_END(以文件末尾为参考点),当offset设为正数则为SEEK_END+offset作为起始位置。当offset设为负数则为SEEK_END-offset作为起始位置。当SEEK_END+offset作为起始位置时,此时已经超出了文件内容,所以读出的数据会乱码或者无确定的值。

计算文件大小和移动读写文件内容的起始位置:就在于一个是确定终点值,一个是确定起始值。

你可能感兴趣的:(嵌入式Linux,C应用编程,arm,linux,ubuntu,c语言)