2012-04-12 43 views
5

我想写一个猫克隆锻炼C,我有这样的代码:到stdout用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

不要使用'feof'作为你的循环条件;它将不会返回true,直到*你试图读取文件末尾之后,所以你的循环可能会经常执行一次。请检查'fread'的结果,如果它小于BLOCK_SIZE,*然后*调用'feof'来检查文件结束。你需要在'fwrite'调用之后添加'fflush(stdout);'。 – 2012-04-12 18:14:50

+1

这里fread()几乎总是导致零字节,除非你输入正好512个字符。 – 2012-04-12 18:17:56

+1

@JohnBode我的编辑看起来如何? – yasar 2012-04-12 18:32:15

回答

1

尝试fwrite()

2

你的问题似乎是fread的返回值。我修改了您的代码以打印出值字节,并且每次都得到0。 fread的手册页明确指出fread的返回值不是字符数。如果遇到EOF,返回值可能为零(在这种情况下就是这种情况)。这是因为您正试图读取1个大小为BLOCK_SIZE的文件,而不是BLOCK_SIZE大小为1的文件。

+0

fread()的结果是读取的字节数,但参数2和3确实指定了行为:“1个大小为n的块”,而“最多n个大小为1的块”。在OPs代码中,他想要一个大小为512的块。 – 2012-04-12 18:28:58

+0

是的,我在阅读你的答案时就像我在发布我的东西。我只是添加了一个编辑,使其更清晰。在另一篇文章中你的回答可能有点难以解析新的语言人士。我也投了你的回答:) – natet 2012-04-12 18:31:43

1

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

fread调用中交换块大小和元素大小的顺序。您想要读取大小为1的BLOCK_SIZE元素(根据定义,sizeof (char)为1);你在做什么是试图读取大小BLOCK_SIZE的1元,所以除非你在至少 BLOCK_SIZE个字符类型,fread将返回0督察,您的通话fread必须

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

做出类似更改为拨打fwrite