2

これは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ループの非動作スニペットの例です。

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ループの非動作スニペットの例です。

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;
}

total_bytes_read上記の2つのスニペットに、がループに等しい場合にループが終了しない理由を知りたいですfsize:O
よろしくお願いします!

4

3 に答える 3

6

スニペット2および3の外側のループは、内側のループが終了しないため終了しません。total_bytes_read != fsizeループは、その継続条件をチェックする機会を得ることはありません。

ネストされたループ内で同じ条件をチェックし、制限カウントに達した場合にブレークアウトするため、スニペット1は正常に機能します。

次のように、両方の条件を1つのループに組み合わせることができます。

while((total_bytes_read != fsize) && (nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0) {
    ...
}
于 2012-07-03T13:51:34.897 に答える
0

ループを停止するブレークを削除したため

if(total_bytes_read == fsize) break;
于 2012-07-03T13:52:17.633 に答える
0

この方法で読み取りループをコーディングしないのには理由があります。(実際には多くあります。)fsizeを計算し、読み取り中にファイルのサイズが変更された場合、ループは終了しません。これをしないでください!ファイルサイズを計算する必要はありません。なくなるまでデータを読み取るだけです。

于 2012-07-03T14:52:54.297 に答える