2008-09-05 5 views
13

私は項目の状態を表示する必要があるコンソールアプリケーションを持っていますが、私はむしろ現在のステータスが同じ行に表示され続けるのを見たいと思っています。例のために:サードパーティのライブラリを使用せずに、WindowsのネイティブC++コンソールアプリケーションでコンソールの同じ部分を上書きする方法はありますか?

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

「nnが」現在の割合が完了し、「BBBB」の上で定期的に更新され、バッファサイズである出力、でなければなりませんコンソールの同じ行。

私が最初にやったアプローチは、新しい状態を印刷する前に正しい数のバックスペースをコンソールに単に印刷しましたが、これは取り除きたい不快なちらつきがあります。私はまた、この1つの簡単な必要性のために別の依存関係を導入しないように、標準ライブラリかMS提供の機能(VC 8)に固執したいと思います。

答えて

8

あなたはSetConsoleCursorPositionを使用することができます。出力バッファのハンドルを取得するには、GetStdHandleに電話する必要があります。

+0

詳細については私の答えを見てください。しかし私の単純なケースでは、これは最も簡単なアプローチでした。 –

0

Linuxでは、\ bおよび/または\ rをstderrに出力することでこれを実現できます。 Windowsで適切な組み合わせを試す必要があるかもしれません。

5

\ rを使用して印刷し、改行を生成するか、最後に\ nを追加する関数を使用しないと、カーソルは行の先頭に戻り、次のアップ。印刷前に完全な文字列を生成すると、フリッカーも減少する可能性があります。

UPDATE:質問は、もはや完全に私の答えを作る2つの出力のラインの代わりに、1に変更されました。より複雑なアプローチが必要である可能性が高い。 JPはConsole APIで適切なアイデアを持っています。私は、あなたの目標を達成するために必要な多くの事柄について以下のサイトで詳しく述べています。このサイトでは、ちらつきを減らすための鍵は、すべてを表示前にオフスクリーンにすることだと述べています。これは、テキストまたはグラフィックス(2Dまたは3D)であれば、画面上に何かを表示しているときは常に当てはまります。

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

6

Joseph、JP、およびCodingTheWheelはすべて貴重な助けとなりました。

私の単純なケースの場合

、最も直接的なアプローチは、CodingTheWheel's answerに基づいているように見えた:経由で提供されている例と連携して、JP's answerによって提供されるように、より複雑な問題については

// 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 
    //... 
} 

、フルconsole APIlinkからJoseph's answerまでは役に立つかもしれませんが、私はそのような単純なアプリにはあまりにも退屈なことを使うのに必要な作業を見つけました。

関連する問題