2012-04-12 6 views
5

、私はこのコードを持っている:読むが、私はCを行使する猫のクローンを記述しようとしています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'を使用しないでください。あなたがファイルの終わりを過ぎて読もうとした*後*までは真ではないので、あなたのループはあまりにも頻繁に実行されるかもしれません。代わりに 'fread'の結果をチェックし、BLOCK_SIZEより小さい場合は' * 'を呼び出してファイルの終わりをチェックする 'feof'を呼び出します。そして 'fwrite'呼び出しの後に' fflush(stdout); 'を追加する必要があります。 –

+1

ここで、正確に512文字を入力しない限り、fread()はほとんど常にゼロバイトになります。 –

+1

@JohnBode私の編集はどのように見えるのですか? – yasar

答えて

7

fflush(stdout)を呼び出してみてください:https://stackoverflow.com/a/296018/27800

fread(buffer, sizeof(char), block_size, stdin); 
を は、コメントと回答によると、私はこれをやってしまいました
1

fwrite()

2

あなたの問題はfreadの戻り値のようです。私は値のバイトを出力するようにコードを修正し、毎回0を返します。 freadのmanページは、freadの戻り値が文字数ではないことを明確にしています。 EOFに遭遇した場合、戻り値はゼロである可能性があります(これはこの場合です)。これは、サイズ1のBLOCK_SIZEではなく、サイズBLOCK_SIZEのものを1つ読み込もうとしているためです。

+0

fread()の結果は読み取られたバイト数ですが、パラメータ2と3は振る舞いを指定します。「サイズ1のnブロック」と「サイズ1のnブロックまで」。 OPコードでは、彼は1ブロックのサイズ512を望んでいる。 –

+0

ええ、私は自分の投稿を読んでいるように答えを読んだ。私はちょうどそれをより明確にする編集を追加しました。他の投稿のあなたの答えは、その言語に新しい人のために解析するのが少し難しいかもしれません。私もあなたの答えに投票した:) – natet

1

私のコメントは無視してくださいfflush;それは問題ではありません。

freadコールでブロックサイズと要素サイズの順序を入れ替えます。サイズ1のBLOCK_SIZE要素を読み込みたいとします(sizeof (char)は定義で1です)。あなたはfreadは0 IOWを返し、少なくとも BLOCK_SIZE文字を入力しない限り、あなたのfread呼び出しが類似してください

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

にする必要があるので、何をやっていることは、サイズのBLOCK_SIZEの1つの要素を読み込むしようとしていますfwriteコールに変更してください。

関連する問題