从标准输入写读在C到标准输出(Read from stdin write to stdout in

2019-07-28 22:25发布

我试图写一个猫克隆锻炼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 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;
    }

}

Answer 1:

我可以通过我举一个答案: https://stackoverflow.com/a/296018/27800

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


Answer 2:

你的问题似乎是FREAD的返回值。 我修改你的代码打印出来的值的字节,每一次我得到0。 对于FREAD手册页明确指出的fread的返回值不是字符数。 如果遇到EOF返回值可以为零(这是在这种情况下)。 这是因为你正试图在1两件事是大小BLOCK_SIZE而不是BLOCK_SIZE事情是大小1阅读。



Answer 3:

尝试调用fflush(stdout)fwrite()



Answer 4:

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

交换的块大小和在元件尺寸的顺序fread呼叫。 你想读的最多的block_size大小为1件( sizeof (char)定义是1); 你正在做的是试图读取大小BLOCK_SIZE的1元,所以除非你键入至少 BLOCK_SIZE字符是什么, fread将返回0督察,你fread调用需要

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

作出类似的变化给fwrite调用。



文章来源: Read from stdin write to stdout in C