2012-04-12 17 views
5

yılında stdout Stdin yazma başlayarak oku, Bu kodu vardır: Ben echo "1..2..3.." | ./cat ve ./cat < garbage.txt denedikBen C egzersiz bir kedi klonu yazmaya çalışıyorum 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; 
} 

ama terminalde herhangi bir çıktı görmüyorum . Burada ne yapıyorum?

Düzenleme: i bana göre bir cevap alıntı

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

Döngü koşulunuz olarak 'feof' kullanmayın; Dosyanın sonunu okumaya çalıştığınızda * bu kadar * true olmayacak, böylece döngü çok sık bir kez yürütülebilmektedir. Bunun yerine 'fread' sonucunu kontrol edin ve BLOCK_SIZE'dan daha küçükse, * dosya sonu için kontrol etmek için * feof'i arayın. Ve 'fwrite' çağrısından sonra 'fflush (stdout); –

+1

burada fread() neredeyse 512 karaktere yazılmadıkça neredeyse her zaman sıfır bayttır. –

+1

@JohnBode Düzenlemem nasıl görünüyor? – yasar

cevap

1

fwrite()

2

Sorununuz, yaymanın dönüş değeri olarak görünüyor. Değer baytlarını yazdırmak için kodunuzu değiştirdim ve her seferinde 0 aldım. Fread için adam sayfası, fread'in dönüş değerinin karakter sayısı DEĞİLDİR. EOF ile karşılaşılırsa, dönüş değeri sıfır olabilir (bu durumda bu). Bunun nedeni, boyutu 1 olan BLOCK_SIZE şeyleri yerine BLOCK_SIZE boyutu olan 1 öğeyi okumaya çalıştığınızdır.

+0

fread() sonucu okunan bayt sayısıdır, ancak parametre 2 ve 3 şu davranışı belirtmektedir: "1 n boyutu bloğu", "1 boyutuna kadar olan bloklar". OPs kodunda, 512 boyutunda bir blok istiyor. –

+0

Evet, cevabınızı benim de benimki gibi yazdım. Bunu daha açık hale getirmek için bir düzenleme ekledim. Diğer yayındaki cevabınız, dile yeni olan biri için ayrıştırılması biraz zor olabilir. Ayrıca cevabınıza da oy verdim :) – natet

1

fflush; Sorun bu değil.

fread çağrısında blok boyutunun ve öğe boyutunun sırasını değiştirin. 1 boyutundaki BLOCK_SIZE öğelerini okumak istiyorsanız (sizeof (char) 1 tanımlıdır); ne sen en az BLOCK_SIZE karakterleri yazın sürece, fread 0. IOW dönecektir böylece, boyut BLOCK_SIZE 1 elemanını okumaya çalışıyor yapıyoruz, sizin fread çağrı

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

benzer Make olması gerekir fwrite aramasına geçin.

İlgili konular