15

アイテムの状態を表示する必要があるコンソール アプリがありますが、テキストを狂ったようにスクロールするのではなく、現在の状態が同じ行に表示され続けるのを見たいと思います。例のために:

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

ここで、「nn」は現在の完了率、「bbbb」はコンソールの同じ行で定期的に更新されるバッファ サイズです。

私が取った最初のアプローチは、新しい状態を出力する前に、正しい数のバックスペースをコンソールに出力するだけでしたが、これには不快なちらつきがあり、これを取り除きたいと考えています。また、この 1 つの単純なニーズに対して別の依存関係を導入しないように、標準ライブラリまたは MS 提供の機能 (VC 8) のいずれかに固執したいと考えています。

4

5 に答える 5

8

You can use SetConsoleCursorPosition. You'll need to call GetStdHandle to get a handle to the output buffer.

于 2008-09-05T06:12:27.007 に答える
7

Joseph、JP、およびCodingTheWheelはすべて貴重な支援を提供しました。

私の単純なケースでは、最も簡単なアプローチはCodi​​ngTheWheelの答えに基づいているように見えました:

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

より複雑な問題については、 JPの回答によって提供される完全なコンソールAPIが、 Josephの回答からのリンクを介して提供される例と連携して役立つ場合がありますが、このような単純なアプリでは、使用するのに必要な作業が面倒であることがわかりました。CHAR_INFO

于 2008-09-08T15:03:53.910 に答える
5

\r を使用して印刷し、改行を生成する関数や最後に \n を追加する関数を使用しない場合、カーソルは行の先頭に戻り、次に入力したものを上書きして印刷します。印刷前に完全な文字列を生成すると、ちらつきも減少する可能性があります。

更新:質問は1行ではなく2行の出力に変更されたため、回答が完了しなくなりました。より複雑なアプローチが必要になる可能性があります。JP はConsole APIについて正しい考えを持ってい。次のサイトには、目標を達成するために必要な多くのことが詳しく説明されていると思います。このサイトでは、ちらつきを減らすための鍵は、表示する前にすべてを画面外にレンダリングすることであるとも述べています. これは、テキストまたはグラフィックス (2D または 3D) のいずれであっても、画面に何かを表示する場合に当てはまります。

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

于 2008-09-05T06:01:33.647 に答える
3

ジョセフの提案では十分な柔軟性が得られない場合は、コンソール API を参照してください: http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx

于 2008-09-05T06:12:42.263 に答える
0

Linux では、\b および/または \r を stderr に出力することでこれを実現できます。Windows で適切な組み合わせを見つけるには、実験が必要になる場合があります。

于 2008-09-05T05:55:18.810 に答える