2016-09-15 23 views
8

'dan sonra satır arabelleği modunda stdout'a newline olmadan dize yazdırır Çoğu terminalin varsayılan olarak satır arabelleği modunda olduğunun farkındayım. Örneğin, çıkış yeni bir satır karakteri ile karşılaşılana kadar tamponlanır ve stdout'a yönlendirilmez.printf(), scanf()

yüzden (tampon doldurdu en azından önce) bu hiçbir şey yazdırmak beklenir:

int main() { 
    while(1) { 
     printf("Haha"); 
     sleep(1); 
    } 
    return 0; 
} 

Gerçekten kısa bir süre için hiçbir şey yazdırır.

Her saniye "Haha" yazdırmak isterseniz, printf("Haha\n") veya printf sonra fflush(stdout) yapabilirim.

int main() { 
    char char_in; 
    while(1) { 
     printf("Haha. Input sth here: "); 
     scanf("%c", &char_in); 
    } 
    return 0; 
} 
:

Şimdi ((1) döngü programı Çıkışta kızarma tampon önlemek için ise benim eklenmesiyle) çok klasik scanf programını çağırmak (Olayların bu kadar taşınabilir değil biliyorum, ama yine de bir çözüm var)

Şimdi program Haha. Input sth here:'u yazdırıyor (ve girişimi bekle). Scanf ifadesini kaldırırsam burada olmaz. Neden böyle?

Teşekkürler.

+1

Genel çıktıyı gösterebilir misiniz lütfen. –

+2

'fflush (stdout)' ince ve taşınabilir; sorunlu olan [fflush (stdin) '] (http://stackoverflow.com/questions/2979209/using-fflushstdin) 'dir. –

+4

scanf() 'etkileşimli bir aygıttan okuduğunda, standart çıktı da etkileşimli bir aygıta ('interaktif aygıt' için 'terminal' düşünün) giderse, otomatik olarak fflush (stdout)' işlevini çalıştırır. Standart tarafından ne zorunlu ne de yasaklanmıştır - ancak senkronizasyon yaygındır ve geniş bir tarihsel önceliğe sahiptir. —bunun daha önce sorulmuş (ve cevaplandırılmıştır) olduğuna inanıyorum. Şimdi tekrar bulmak için ...Muhtemelen, istemli bir egzersiz. (Ayrıca, iki sayımda scanf ("% c", & char_in) "ile daha iyi bir performans elde edersiniz - bir işaretçiyi geçirir ve önceki satırlar gibi beyaz alanı atlar). –

cevap

3

Şimdi program Haha. Input sth here:'u yazdırıyor (ve girişimi bekle). Scanf ifadesini kaldırırsam burada olmaz. Neden böyle?

standart (N1570 .. "neredeyse C11") dediği için

, §5.1.2.3/6 (vurgu benim): Bir uyumlu uygulanmasına ilişkin

az gereksinimleri şunlardır:

[..] 7.21.3 belirtilen interaktif cihazların

  • giriş ve çıkış dinamikleri yer alacaktır. Bu gereksinimlerin amacı, arabelleklenmemiş veya satır tamponlu çıktının 'a kadar en kısa sürede görüntülenmesinin, iletilerin gerçekten de girdisini bekleyen bir programdan önce görünmesini sağlamasıdır. o

[..] çıktı bir yeni satır içeren ve stdout tamponlu bir hatta gönderilir olmasa da

, programınız girişi için beklemek izin verilmeden önce görünmesini sahiptir. Bunun nedeni, stdout ve stdin'un bir terminale bağlı olması ve bu nedenle standartların "etkileşimli aygıtlar" olarak adlandırdığı (Dikkat: Bu uygulama tanımlıdır!).

+0

omg. Standart belgelere gerçekten bakıyorsunuz! Emeğin için teşekkürler. Benim gibi yeniler, başka türlü nereye bakacağını bilmezler. –