0

少し前に C の学習を始めたばかりで、特定のプログラムについて助けが必要です。ファイルから行を読み取り (一度に約 50 バイト)、バイナリ ファイルを含む新しいファイルにコピーする必要があります。それは非常に簡単ですが、私はそれをどのように行うべきかについて問題を抱えています。これまでのところ、

 while ( ) {
    read (infile, buffer, 50);
    if (r< 0) {
            perror("cannot read infile");
            exit (-1);
    }
    if (r==0) {
            break;
    }
    write (outfile, buffer, r);
    }

必要なファイルをすでに開いて閉じている間。ループは一度に 50 バイトずつファイルを読み取り、それらを新しいファイルに書き込む必要がありますが、while ループの条件がどうあるべきかわかりません。ファイル内のバイト数を取得して、バイトが残っている限りファイルをループするようにすることを考えていました。ただし、その方法は完全にはわかりません。正しい方向への助けはありますか?

4

3 に答える 3

2

次の戻り値を取得する必要がありますread

r = read (infile, buffer, 50);

ループがどのように設定されているかを考えると、常に真の条件を使用できます: while(1)(ファイルの最後に到達したときに既にブレークしているため)

于 2013-10-10T01:19:53.487 に答える
2
while (1) {
    int r = read (infile, buffer, 50);
    if (r< 0) {
            perror("cannot read infile");
            exit (-1);
    }
    if (r==0) {
            break;
    }
    if(write (outfile, buffer, r) != r)
            printf("write error\n");  
}
于 2013-10-10T01:27:34.310 に答える
0

最初に、(r == 0) を (r < 50) に変更できます。最後の行はおそらく完全な 50 バイトではないからです。そうである場合、次の実行はいずれにせよ 0 になり、それでも true と評価されます。そして、実際に r を read() からの戻り値としてキャプチャすることはありません。

実際の質問については、さまざまな方法で行うことができます。現在、あなたは書くことができます

while(1){

    r = read(infile, buffer, 50);

    if ( r < 50) {
    ...
    break;
    }
}

うまくいきます。r < 50 の条件が満たされると、break ステートメントはループを終了します。これは、バイトが読み取られなかったことを意味します。

より明確で読みやすいコードの場合、次のように int をブール値として使用できます。

int FileDone = 0;
while(!FileDone){        
    ...
    if ( r < 50) {
        FileDone = 1
    }
}

または多分このように:

int r = 1;
while (r > 0){

    r = read(infile, buffer, 50);

    if (r < 0) {
        perror("cannot read infile");
        exit (-1);
    }

    write (outfile, buffer, r);
}
于 2013-10-10T01:32:31.143 に答える