免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 20505 | 回复: 5
打印 上一主题 下一主题

关于lseek和fseek的用法分析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-24 21:22 |只看该作者 |倒序浏览
这两个函数的定义我都看过了
一个是对流,一个是对文件
不过具体在用法上的差别是还是不清楚

前辈能不能举个实例啊
不甚感激
ps:UNIX环境高级编程 里面关于这部分的都看过了  还不是很理解,我智商不高,前辈回答的时候尽量通俗易懂点哈  再次谢谢

论坛徽章:
0
2 [报告]
发表于 2010-01-24 21:29 |只看该作者
相关内容在网上查了 没查到什么

论坛徽章:
0
3 [报告]
发表于 2010-01-24 23:16 |只看该作者
fd = open()...
lseek



fp = fopen()
fseek

论坛徽章:
0
4 [报告]
发表于 2010-01-25 13:11 |只看该作者
:wink:   概念我很清楚了  其实就是不知道在实例中的具体应用

论坛徽章:
0
5 [报告]
发表于 2010-02-08 16:52 |只看该作者
这两个函数的定义我都看过了
一个是对流,一个是对文件
不过具体在用法上的差别是还是不清楚

前辈能不 ...
yanzhiyi1012 发表于 2010-01-24 21:22



    一个是对流,一个是对文件???

我觉得都是对文件,如果非要加上'流'的话,那就是都是针对文件流。

lseek是系统调用,在man手册中章节是:Section: System calls (2)
fseek是库函数,在man手册中章节是:Section: Linux Programmer's Manual (3)

fseek为了实现自己的动作,会去调用lseek。

这两个函数的返回值不同。

另外我在操作文件的offset的时候,从来都是用,fseek的相关函数。
#include <stdio.h>

int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
void rewind(FILE *stream);
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);   


从来不直接用lseek函数。


也就是当你想用lseek的时候,fseek肯定能完成想要的动作。


例如取得文件长度:
UINT32 filesize(FILE *fp)
{
        UINT32 fSet,fEnd,filelen;   

        fseek(fp,0,SEEK_SET);  
          fSet = ftell(fp);   

        fseek(fp,0,SEEK_END);  
          fEnd = ftell(fp);   
       
        rewind(fp);

        return (filelen = fEnd - fSet);  
}

论坛徽章:
0
6 [报告]
发表于 2010-02-08 17:09 |只看该作者
在例如:
你发现,要读取的文件,从起始位置开始,有10Byte是没用的,想从第11个开始读起,那么:
UINT32 start_remain = 10;
UINT8 tmp_buff[20];
fseek(fp,start_remain,SEEK_SET);
if(fread(tmp_buff,20,1,stream)){
...
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP