2011-10-24 12 views
21

Aşağıdaki kod için tam sonucu elde etmek için stdout'un arabelleğe alınmasını devre dışı bırakmak istiyorumC'deki stdout'un arabelleğe alınması nasıl kapatılır

while(1) { 
printf("."); 
sleep(1); 
} 

'.' sadece tampon doldurulduğunda.

+3

Neden 'fflush (stdout)' ilgilenecek

setbuf(stdout, NULL); 

Bu setbuf kullanabilir? –

+1

olası bir kopyası var [Bir satırsonu dizgisinde yer almadığı sürece baskı neden aramadan sonra temizlenmiyor? (C)] (http://stackoverflow.com/questions/1716296/why-does-printf-not-flush-after-the-call-unless-a-newline-is-in-the-format-strin) – DarkDust

+1

StackOverflow * 'da en çok sorulan sorular için aday. – DarkDust

cevap

5

fflush(stdout)'u kullanın. Arabelleği temizlemek için her printf'dan sonra çağırabilirsiniz. parametresi olarak stdout

setvbuf(stdout, NULL, _IONBF, 0); 
+13

Bu gerçekten "C'deki stdout'un arabelleğe alınmasını kapatmaz". – hagello

-2

Sen

write(1, ".", 1); 

yerine

printf("."); 
70
+3

İyi biri. Teşekkürler. Bu arada setbuf (stream, NULL); 'setvbuf (stream, NULL, _IONBF, BUFSIZ) 'a eşdeğerdir;' – sehe

+10

Tek uyarı: ** setbuf' veya 'setvbuf' kelimesini ** ilk olarak çağırmak yasaldır ** Herhangi bir giriş veya çıkış yapılmadan önce bir akışta işlem yapılması. Böylece, "fflush" ifadesinin kullanılması genellikle daha iyi bir fikirdir. –

1

Kullanım fflush (FILE * akım):

7

Ayrıca her şeyi

+0

Bu çok iyi bir cevap değil, Newlib'den alıntı: 'Hem ANSI C hem de Sistem V Arabirim Tanımlaması (Sorun 2), <> gerektirir. Ancak, <> arabelleği işaretçisinin anlamı üzerinde farklılık gösterir: SVID sorunu 2 belirtimi,> arabelleği işaretçisinin arabelleğe alınmadığını bildirir. Maksimum taşınabilirlik için <> arabellek işaretçilerinden kaçının. – MightyPork

İlgili konular