从stdin读取写入C中的stdout

时间:2012-04-12 17:57:17

标签: c io stdout stdin stdio

我正在尝试编写一个猫克隆来练习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 个答案:

答案 0 :(得分:7)

我可以引用一个答案:https://stackoverflow.com/a/296018/27800

fread(buffer, sizeof(char), block_size, stdin);

答案 1 :(得分:2)

您的问题似乎是fread的返回值。我修改了你的代码来打印出值字节,每次都得到0。 fread的手册页清楚地表明fread的返回值不是字符数。如果遇到EOF,则返回值可能为零(在这种情况下)。这是因为你试图读入一个大小为BLOCK_SIZE而不是BLOCK_SIZE大小为1的东西。

答案 2 :(得分:1)

尝试在fflush(stdout)

之后致电fwrite()

答案 3 :(得分:1)

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

fread调用中交换块大小和元素大小的顺序。您想要读取大小为1的BLOCK_SIZE元素(根据定义,sizeof (char)为1);你正在做的是尝试读取1个大小为BLOCK_SIZE的元素,所以除非你输入至少 BLOCK_SIZE个字符,fread将返回0. IOW,你的fread来电需要

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

fwrite电话进行类似的更改。