5

私はCを行使するために猫のクローンを書き込もうとしています、私はこのコードを持っています:

#include <stdio.h>
#define BLOCK_SIZE 512
int main(int argc, const char *argv[])
{
    if (argc == 1) { // copy stdin to stdout
        char buffer[BLOCK_SIZE];
        while(!feof(stdin)) {
            size_t bytes = fread(buffer, BLOCK_SIZE, sizeof(char),stdin);
            fwrite(buffer, bytes, sizeof(char),stdout);
        }
    }
    else printf("Not implemented.\n");
    return 0;
}

試しましたが、端末に出力が表示さecho "1..2..3.." | ./cat./cat < garbage.txtません。私がここで間違っていることは何ですか?

編集:コメントと回答によると、私はこれを行うことになりました:

void copy_stdin2stdout()
{
    char buffer[BLOCK_SIZE];
    for(;;) {
        size_t bytes = fread(buffer,  sizeof(char),BLOCK_SIZE,stdin);
        fwrite(buffer, sizeof(char), bytes, stdout);
        fflush(stdout);
        if (bytes < BLOCK_SIZE)
            if (feof(stdin))
                break;
    }

}
4

4 に答える 4

8

私は私の答えを引用できます:https://stackoverflow.com/a/296018/27800

fread(buffer, sizeof(char), block_size, stdin);
于 2012-04-12T18:02:27.417 に答える
2

あなたの問題は fread の戻り値のようです。値のバイトを出力するようにコードを変更しましたが、毎回 0 になります。fread のマニュアル ページでは、fread の戻り値が文字数ではないことを明確にしています。EOF が発生した場合、戻り値はゼロになる可能性があります (この場合はゼロです)。これは、サイズが 1 の BLOCK_SIZE のものではなく、サイズが BLOCK_SIZE のものを 1 つ読み込もうとしているためです。

于 2012-04-12T18:24:16.930 に答える
1

fflush;に関する私のコメントは無視してください。それは問題ではありません。

呼び出しでブロック サイズと要素サイズの順序を入れ替えfreadます。サイズ 1 の BLOCK_SIZE 要素まで読み取りたい (sizeof (char)定義により 1 です)。あなたがしているのは、サイズ BLOCK_SIZE の 1 つの要素を読み込もうとしているため、少なくともBLOCK_SIZE 文字を入力しない限り、fread0 が返されます。IOW、あなたのfread呼び出しは

size_t bytes = fread(buffer, 1, sizeof buffer, stdin);

呼び出しに同様の変更を加えfwriteます。

于 2012-04-12T18:34:34.593 に答える
1

fflush(stdout)の後に電話してみてくださいfwrite()

于 2012-04-12T18:02:04.623 に答える