免费注册 查看新帖 |

Chinaunix

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

read(),获取文件时缓冲大小设为固定成么 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-02 15:29 |只看该作者 |倒序浏览
网上下个ftp程序的源代码,其获取客户端文件并写入文件系统的实现让我困惑关键代码如下
fd = open(pathname, O_RDWR|O_CREAT);
.....
for(;;){
        rsize = read(sd, buff, BUF_LEN);
        if(rsize == 0) {
            break;
        }
                if(rsize < 0)
                {....}
                write(fd, buff, rsize);
}
...

缓冲buff的大小是固定的BUF LEN ,文件传输的过程数据一般比较大的
如果缓冲满了,怎么从套接口读取剩余的数据呢?

为啥循环写就可以了阿

[ 本帖最后由 kelvin_ke 于 2009-9-2 18:36 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-09-02 15:58 |只看该作者
BUF_LEN不用扩大。循环吗

论坛徽章:
0
3 [报告]
发表于 2009-09-02 16:06 |只看该作者
原帖由 思一克 于 2009-9-2 15:58 发表
BUF_LEN不用扩大。循环吗


ls的意思是,循环会自动刷新buff,还是因为循环内作用域内部只是改变了局部的buff,实际没有变。不知道我这样理解对不对

论坛徽章:
0
4 [报告]
发表于 2009-09-02 16:08 |只看该作者
用循环写啊。

论坛徽章:
0
5 [报告]
发表于 2009-09-02 18:36 |只看该作者
有谁能详细说下麻

论坛徽章:
0
6 [报告]
发表于 2009-09-02 20:55 |只看该作者
我也没看懂
if(rsize < 0)
                {....}
                write(fd, buff, rsize);

楼主最好能把代码贴全点

论坛徽章:
0
7 [报告]
发表于 2009-09-02 21:05 |只看该作者
原帖由 rollin7 于 2009-9-2 20:55 发表
我也没看懂
if(rsize < 0)
                {....}
                write(fd, buff, rsize);

楼主最好能把代码贴全点


省略的都是错误处理代码,没什么关系。
就是循环读取连接的数据到buff里面,再写入fd指向的文件
关键是buff 不会填满么? 没有清空阿。

论坛徽章:
0
8 [报告]
发表于 2009-09-02 23:42 |只看该作者

回复 #7 kelvin_ke 的帖子

呵呵,不用清空的啊read的时候相当于strcpy了,也就是说拷贝过来的串后面都有一个‘\0’的, rsize是得到了‘\0'前字符的个数,所以buff是重用的,每次从buff[0]开始重新赋值,就算'\0'后面还有上一次的值,可是下面的write只写到'\0'处,这个不用担心的吧。。大的数据,只要用循环多写几次,不就搞定了??

论坛徽章:
0
9 [报告]
发表于 2009-09-03 08:50 |只看该作者
接收到一段数据, 就写入文件, 然后再用同样的缓冲接收下一段数据, 再写入文件... 这有什么问题? 缓冲只是一个临时的场所, 可以重复利用.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP