免费注册 查看新帖 |

Chinaunix

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

一个经典的拷贝文件的代码的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-16 11:25 |只看该作者 |倒序浏览
/* 以下代码是一个经典的拷贝文件的代码 */
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
{
if((bytes_read==-1)&&(errno!=EINTR)) break;        /* 一个致命的错误发生了 */
else if(bytes_read>0):
{
        ptr=buffer;
        while(bytes_write=write(to_fd,ptr,bytes_read))
        {
                if((bytes_write==-1)&&(errno!=EINTR))break;  /* 一个致命错误发生了 */
                 else if(bytes_write==bytes_read) break;     /* 写完了所有读的字节 */
                  else if(bytes_write>0)                     /* 只写了一部分,继续写 */
                   {  ptr+=bytes_write;         bytes_read-=bytes_write;
                    }
          }
        if(bytes_write==-1)break;                        /* 写的时候发生的致命错误 */
}
}
close(from_fd);
close(to_fd);
对于上面的read和write函数,他们是怎么保证下次的读出(写入)位置能跟在本次读出(写入)位置的后面?通过file结构里的f_pos来实现?如果对同一文件既追加又读出那么会不会乱呢?能不能发个相关的read/write的代码让小弟学习学习!

论坛徽章:
0
2 [报告]
发表于 2006-08-16 18:20 |只看该作者
原帖由 sopc_rome 于 2006-8-16 11:25 发表

  1. /* 以下代码是一个经典的拷贝文件的代码 */
  2. while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
  3. {
  4. if((bytes_read==-1)&&(errno!=EINTR)) break;        /* 一个致命的错误发生了 */
  5. else if(bytes_read>0):
  6. {
  7.         ptr=buffer;
  8.         while(bytes_write=write(to_fd,ptr,bytes_read))
  9.         {
  10.                 if((bytes_write==-1)&&(errno!=EINTR))break;  /* 一个致命错误发生了 */
  11.                  else if(bytes_write==bytes_read) break;     /* 写完了所有读的字节 */
  12.                   else if(bytes_write>0)                     /* 只写了一部分,继续写 */
  13.                    {  ptr+=bytes_write;         bytes_read-=bytes_write;
  14.                     }
  15.           }
  16.         if(bytes_write==-1)break;                        /* 写的时候发生的致命错误 */
  17. }
  18. }
  19. close(from_fd);
  20. close(to_fd);
复制代码

对于上面的read和write函数,他们是怎么保证下次的读出(写入)位置能跟在本次读出(写入)位置的后面?通过file结构里的f_pos来实现?如果对同一文件既追加又读出那么会不会乱呢?能不能发个相关的read/write的代码让小弟学习学习!


read、write的文件操作指针自动控制吧,不用你操心啊!除非你要向前或向后移动,否则默认就是你上次操作结束的位置。
拷贝程序,当然不能用于对同一个文件操作,如果对同一个文件操作,你应该自己控制读写指针,用lseek函数操作。

论坛徽章:
0
3 [报告]
发表于 2006-08-17 18:15 |只看该作者
哦.
谢过!

论坛徽章:
0
4 [报告]
发表于 2006-08-17 19:01 |只看该作者
不觉得经典,觉得这是最糟糕的代码, 出了错误居然没有任何处理.

论坛徽章:
0
5 [报告]
发表于 2006-08-18 10:22 |只看该作者
原帖由 connet 于 2006-8-17 19:01 发表
不觉得经典,觉得这是最糟糕的代码, 出了错误居然没有任何处理.


人家抛砖引玉呗,你给个经典的大家学习一下吧!
:em11:

论坛徽章:
0
6 [报告]
发表于 2006-08-18 14:15 |只看该作者
原帖由 connet 于 2006-8-17 19:01 发表
不觉得经典,觉得这是最糟糕的代码, 出了错误居然没有任何处理.

nod,复制的机制很糟糕,最起码应该内存映射
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP