从stdin读取写入C中的stdout

我正在尝试编写一个猫克隆来练习C,我有这个代码:

#include  #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; } } 

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

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

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

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

忽略我对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调用进行类似的更改。