You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言文件复制代码中rbytes>0循环及重复读取逻辑疑问

int copy( char *from, char *to )    {
    int fd_from, fd_to, rbytes, wbytes;
    char buff[256];
    if( ( fd_from = open( from, O_RDONLY ) ) == -1 )
        { perror( "open from" ); return( - 1 ); }
    if( ( fd_to = open( to, O_WRONLY | O_CREAT, 0664 ) ) == -1 )
        { perror( "open to" ); return( -1 ); }
    if( ( rbytes = read( fd_from, buff, 256 ) ) == -1 )
         { perror( "read 1" ); return( -1 ); }
    while( rbytes > 0 )    {
        if( ( wbytes = write( fd_to, buff, rbytes ) ) == -1 )
            { perror( "write" ); return( -1 ); }
        if( wbytes != rbytes )
            { fprintf( stderr, "bad write\n" ); return( -1 ); }
        if( ( rbytes = read( fd_from, buff, 256 ) ) == -1 )
            { perror( "read 2" ); return( -1 ); }
    }
    close( fd_from ); close( fd_to );  return( 0 );
}

问题1:为什么需要设置判断rbytes>0的循环?

  • 代码中使用的缓冲区buff大小只有256字节,绝大多数文件的大小都超过256字节,单次读取只能拿到文件的一部分内容,必须通过循环分块读取、分块写入,才能完成整个文件的复制。如果没有这个循环,最多只能复制大小不超过256字节的文件,更大的文件只会复制前256字节,结果是不完整的。
  • read函数的返回值rbytes代表实际读到的字节数:当读到文件末尾时,read会返回0,此时rbytes>0的条件不成立,循环自动终止,刚好完成整个文件的复制,逻辑严谨不会出现多读或者少读的问题。
  • 代码在进入循环前已经对read的错误返回-1做了捕获处理,能进入循环的rbytes都是合法的、大于0的有效读取长度。

问题2:循环末尾的if语句逻辑是什么,为什么需要再次读取文件?

  • 进入循环之前,代码已经执行了第一次读取,拿到了第一块256字节以内的内容,循环体内的前两个if是把这一块内容完整写入目标文件。
  • 写完当前块之后,必须再次读取源文件的下一块内容,才能继续复制后续的内容:这次read的返回值会重新赋值给rbytes,之后回到while(rbytes>0)的判断:
    • 如果新的rbytes大于0,说明还有未读完的内容,进入下一轮循环写新读到的块;
    • 如果rbytes等于0,说明已经读到文件末尾,直接退出循环,执行关闭文件的逻辑。
  • 这里加if判断是做错误处理:如果读取下一块的过程中出现IO错误,read会返回-1,此时直接打印错误信息、终止复制流程,符合系统编程的错误处理规范。

内容的提问来源于stack exchange,提问作者Light Lamps

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:15:02