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,则返回值可能为零(在本例中为 0)。这是因为您试图读取 1 个大小为 BLOCK_SIZE 的东西,而不是 BLOCK_SIZE 大小为 1 的东西。

于 2012-04-12T18:24:16.930 回答
1

尝试fflush(stdout)后调用fwrite()

于 2012-04-12T18:02:04.623 回答
1

忽略我的评论fflush;那不是问题。

在调用中交换块大小和元素大小的顺序fread。您要读取最多 BLOCK_SIZE 大小sizeof (char)为 1 的元素(根据定义为 1);您正在尝试读取 1 个大小为 BLOCK_SIZE 的元素,因此除非您输入至少BLOCK_SIZE 个字符,fread否则将返回 0。 IOW,您的fread调用需要

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

fwrite对呼叫 进行类似的更改。

于 2012-04-12T18:34:34.593 回答