2008-09-05 11 views
13

Öğelerin durumunu görüntülemek için gereken bir konsol uygulamasına sahibim, ancak metin kaydırmayı deli gibi yapmak yerine mevcut durumun aynı satırlarda gösterilmesini tercih ederim. Örnek olması için:Üçüncü taraf kitaplığı kullanmadan Windows yerel C++ konsol uygulamasında konsolun aynı bölümünün üzerine nasıl yazabilirim?

Running... nn% complete
Buffer size: bbbb bytes

'nn' geçerli yüzdesi tamamlandıktan çıkış, ve 'bbbb'ait' olmalı periyodik olarak güncellenmiş bir tampon boyutu, bir konsolun aynı satırları.

Aldığım ilk yaklaşım, yeni durumu yazdırmadan önce doğru sayıda arka plan alanını konsola yazdırdı, ancak bu, kurtulmak istediğim iğrenç bir titreşime sahip. Ayrıca, bu basit bir gereksinime başka bir bağımlılık getirmemek için standart kitaplığa veya MS tarafından sağlanan işlevselliğe (VC 8) bağlı kalmak istiyorum.

cevap

8

Sen SetConsoleCursorPosition kullanabilirsiniz. Çıkış tamponuna bir tutamaç için GetStdHandle numaralı telefonu aramanız gerekecek.

+0

Daha fazla bilgi için cevabımı görün, ancak basit durumum için bu en kolay yaklaşımdı. –

0

Linux'ta, bunu \ b ve/veya stderr'ye yazdırarak yapabilirsiniz. Windows'taki şeylerin doğru kombinasyonunu bulmak için deneme yapmanız gerekebilir.

5

\ r Kullanarak yazdırırsanız ve bir satır sonu oluşturacak bir işlev kullanmazsanız veya sonuna \ n eklediyseniz, imleç satırın başına dönecek ve bir sonraki yazdığınız şey üzerine yazacaktır. yukarı. Yazdırmadan önce tam dizeyi oluşturmak titreme de azaltabilir.

GÜNCELLEME: Soru artık tam benim cevap yapar 2 çıkış hatlarının yerine 1'e değiştirildi. Daha karmaşık bir yaklaşım gerekli olabilir. JP, Console API ile doğru fikre sahiptir. Aşağıdaki sitenin amacınızı gerçekleştirmek için ihtiyaç duyacağınız pek çok şeyi ayrıntılarına inandığını düşünüyorum. Site ayrıca titremeyi azaltmanın anahtarının, görüntülemeden önce her şeyi ekran dışında oluşturması gerektiğine de dikkat çekiyor. Bu, metin veya grafik (2D veya 3D) olup olmadığı ekranda herhangi bir şey görüntülediğinizde geçerlidir.

http://www.benryves.com/tutorials/?t=winconsole

6

.

benim basit durum için

, en düz İleri yaklaşım CodingTheWheel's answer dayalı gibiydi: aracılığıyla sağlanan örneklerle koordinasyon içinde, JP's answer tarafından sağlanan daha karmaşık sorunlar için

// before entering update loop 
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); 
CONSOLE_SCREEN_BUFFER_INFO bufferInfo; 
GetConsoleScreenBufferInfo(h, &bufferInfo); 

// update loop 
while (updating) 
{ 
    // reset the cursor position to where it was each time 
    SetConsoleCursorPosition(h, bufferInfo.dwCursorPosition); 

    //... 
    // insert combinations of sprintf, printf, etc. here 
    //... 
} 

, tam console APIJoseph's answer numaralı telefondan link yararlı olabilir, ancak bu kadar basit bir uygulama için CHAR_INFO kullanımının çok yorucu olduğunu buldum.