而loop赢了';t出口C

而loop赢了';t出口C,c,while-loop,C,While Loop,这是while循环的一个工作片段: while(total_bytes_read != fsize){ while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){ if(write(fd, filebuffer, nread) < 0){ perror("write"); close(sockd); exit(1);

这是while循环的一个工作片段:

while(total_bytes_read != fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd);
            exit(1);
        }
        total_bytes_read += nread;
        if(total_bytes_read == fsize) break;
    }
}
while(total_bytes_read != fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd);
            exit(1);
        }
        total_bytes_read += nread;
    }
}
while(total_bytes_read < fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd);
            exit(1);
        }
    }
     total_bytes_read += nread;
}
while(总字节数=fsize){
而((nread=read(sockd,filebuffer,sizeof(filebuffer)))>0){
if(写入(fd、filebuffer、nread)<0){
佩罗(“书面”);
关闭(sockd);
出口(1);
}
总字节数读取+=nread;
如果(总字节数=fsize)中断;
}
}
这是while循环的一个非工作片段的示例:

while(total_bytes_read != fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd);
            exit(1);
        }
        total_bytes_read += nread;
        if(total_bytes_read == fsize) break;
    }
}
while(total_bytes_read != fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd);
            exit(1);
        }
        total_bytes_read += nread;
    }
}
while(total_bytes_read < fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd);
            exit(1);
        }
    }
     total_bytes_read += nread;
}
while(总字节数=fsize){
而((nread=read(sockd,filebuffer,sizeof(filebuffer)))>0){
if(写入(fd、filebuffer、nread)<0){
佩罗(“书面”);
关闭(sockd);
出口(1);
}
总字节数读取+=nread;
}
}
这也是while循环的一个非工作片段的示例:

while(total_bytes_read != fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd);
            exit(1);
        }
        total_bytes_read += nread;
        if(total_bytes_read == fsize) break;
    }
}
while(total_bytes_read != fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd);
            exit(1);
        }
        total_bytes_read += nread;
    }
}
while(total_bytes_read < fsize){
    while((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0){
        if(write(fd, filebuffer, nread) < 0){
            perror("write");
            close(sockd);
            exit(1);
        }
    }
     total_bytes_read += nread;
}
while(总字节读取0){
if(写入(fd、filebuffer、nread)<0){
佩罗(“书面”);
关闭(sockd);
出口(1);
}
}
总字节数读取+=nread;
}
我想知道为什么当
total_bytes\u read
等于
fsize
时,循环不会退出:O

提前谢谢

代码段2和3中的外部循环将不会退出,因为内部循环不会退出:
total_bytes_read!=fsize
循环从未有机会检查其继续条件

代码段1工作正常,因为您在嵌套循环中检查相同的条件,如果达到限制计数,就会中断

您可以将这两个条件组合成一个循环,如下所示:

while((total_bytes_read != fsize) && (nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0) {
    ...
}

因为你移除了阻止循环的断点

if(total_bytes_read == fsize) break;

不以这种方式编码读取循环是有原因的。(实际上,有很多。)如果您计算fsize,然后文件在读取时更改大小,则循环将永远不会终止。别这样!不需要计算文件大小;只需读取数据,直到没有更多数据。

如果确定total_bytes_read==fsize,则可能会陷入第二个while循环,因为:(nread=read(sockd,filebuffer,sizeof(filebuffer))>0的计算结果为true还请注意
read(2)
from sockets不会返回
0
,除非另一方以正确的方式发出关闭连接的命令。你所说的“正确的方式”是什么意思?是的,我知道:)我的问题是“为什么没有它,while循环即使具有相同的条件也不会退出”:)但我已经读到,“feof”在while循环中是不好的()在while条件下使用feof也是不合适的。Read-till-Read返回,但是为什么Read-till返回呢?因为Read返回0表示您已经读取了整个文件。但是为什么“小于或等于0”而不是“大于或等于0”?