2012-04-12 65 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