2009-09-02 6 views
5

不正確なタイトルをお詫びしますが、これが正確に何であるかわかりません。C++でフラッディングすることなくコンソールに出力

コンソールに1行の更新行を印刷するにはどうすればよいですか?

たとえば、サイクルごとにパーセント完了ステータスを出力したいが、コンソールにテキストのストリームがあふれないようにするには、どうすればよいだろうか? (これは何と呼ばれていますか? - 今後のGoogle検索向け)

ありがとう!

答えて

11

その後、私たちは前に書いたもの上書き\rを使用してラインの先頭に戻るための簡単な方法があるが、画面をきれいにする何の移植方法はありません。私はWindows APIからSleepを使用しています:

#include <iostream> 
#include <windows.h> 
using namespace std; 

int main() 
{ 
for(int i = 1; i <= 10; i++) 
{ 
    std::cout << i*10 << '%'; 
    std::cout.flush(); // see wintermute's comment 
    Sleep(1000); 
    std::cout << '\r'; 
} 
} 
+0

さらに照らすために、 '\ r'はキャリッジリターンを出力します。 –

+6

'std :: cout'はバッファリングされたストリームであるため、' Sleep() 'の前に' std :: cout.flush() 'を呼び出すと、期待したときに内容が表示されないことがあります。 –

+1

Danが言っているように、 '\ r'はキャリッジリターンで、行をクリアしません。カーソルは行の先頭に移動します。 –

2

基本的な解決策があるに:また

loop: 
    backspace (over written text) 
    write (without newline) 
    flush 
    wait and get updates 

、あなたはcursesライブラリを使用して解決策を試みることができる - 私はこれはかなり何があるかどうかはわからないけれどもあなたは後です。 Cursesは、テキストベースのGUI(時にはTUIと呼ばれる)のための基本的なASCIIグラフィックスを提供します。

+0

Cursesはこのポートを賢く行う唯一の方法です。あなたのコンソールがcurses DBの一部であることを前提としています。 –

3

Cursesは、この移植性を実現するための唯一の方法です。

はこれを見ている:あなたのサイクルはhttp://code.google.com/p/tinycurses/wiki/basic1

+2

私は「唯一の」方法を言いません。端末がANSIと互換性がある場合は、 "\ r"または "\ 015"を出力できます。もしそれがVT-100と互換性があれば、 '\ 033 [5n'をTTYに出力することができます。応答は '\ 033 [5; 5R']の行に沿っています。 '\ 033 [5; 0Hとにかくすべてのncursesです。 – greyfade

+0

唯一**携帯**の方法です。治療法は端末を抽象化するので、VT-100互換または他の何かを知る必要はありません。あなたは、ドキュメントを読んで理解するだけで、あなたが説明したことを、どんな端末でも行うことができます。それはなぜ私たちが呪いを持っているのか**要約**ターミナルはあなたが知る必要はないので、唯一のポータブル**の方法です。他にも(ncursesのような)ライブラリがあります。えええええええええええええええええええええええええんは、cursesしかし、新しいバージョン:-) –

0

どのくらいの速ですか?それらはミリ秒か秒かですか?サイクルが短い場合は、1秒後に画面を更新する必要があるかもしれません。例えば

include <time.h> /* if memory serves me correctly */ 
    int currentTime = time(0); 
    for (int i = 0; i < 100; i++) 
    { 
    /* do work here and save the percentage completed */ 
    lastTime = time(0); 
    if ((lastTime-currentTime) >= 1) 
    { 
     /* output percentage completed (using AraK information) */ 
     currentTime = lastTime; 
    } 
    } 

これは、画面だけを毎秒を更新し、それは(あなたが処理のために使用することができます)画面を再描画するための時間を消費して、画面への書き込み時間の節約になります。さらに、更新が非常に速くなると、画面を常に再描画できるので、サイクルが非常に短い場合にはパーセンテージが表示されます。

注:コメントに基づいて更新されます。

+0

時間(0)する必要があります。 time()はtime_tのアドレスをとり、指定されている場合はtime_tを更新します。 –

+2

または、同じことが表示され、描画呼び出しの数が101を超えていない場合(0% - > 100%表示と仮定して)、パーセントが実際にインクリメントしたときに更新するだけで、 、図面はパフォーマンスに大きな影響を与えることはありません –

+0

入力していただきありがとうございます。私は時間関数を使用して以来、しばらくしています。 – Glenn

0

これは、使用しているプラ​​ットフォームによって異なります。私はあなたがLinux上でこれをどうやっているのかよく分かりませんが、WindowsではWriteConsoleSetConsoleCursorPositionのどちらかを使ってこれを行うことができます。

これを行うための完全な移植可能な方法は、すでに述べたように1トンのバックスペースを出力する以外にはありません。バックスペースメソッドは、あなたのアプリケーションで受け入れられないかもしれない多くのフリッカーを引き起こす可能性があります... Win32関数はフリッカーを引き起こさない。 cursesライブラリについては不明です。

関連する問題