質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

5660閲覧

c++でプログレスバー作成

Daichi

総合スコア47

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

0クリップ

投稿2017/06/29 16:05

プログレスバーを表示する関数を作成してる途中なのですが、つまずいています。
プログレスバーが一つだけなら、綺麗に動くのですが、
プログレスバーを2つ動かそうとすると、最初のプログレスバーが綺麗に動かずに
二つ目のプログレスバーだけ綺麗に動きます。
以下プログラムです。
どのように書けば、二つのプログレスバーが綺麗に動くでしょうか??

アドバイスの方よろしくお願いします。

c++

1void progress_gauge(){ 2 string progress_1 = "progress_1.."; 3 string progress_2 = "progress_2.."; 4 cout << "starting.." << endl; 5 for( int i = 0;i < 10 ;i++) { 6 7 progress_1 += "#"; 8 progress_2 += "##"; 9 10 cout << progress_1 << "\r\n" << flush; 11 cout << progress_2 << "\r" << flush; 12 this_thread::sleep_for(chrono::seconds(1)); 13 } 14 15 cout << endl << "done." << endl; 16 17}
mattn👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

C++ の仕様内だけではそれをするのは無理だと思います。 エスケープシーケンスなどを用いてそれぞれのプログレスバーの表示位置にカーソルを動かす必要があるでしょう。

ただし、エスケープシーケンスやその他の端末制御は各環境によって仕様がかなり違います。 作るプログラムを動かす環境が固定されているのであればその環境の仕様に合わせればよいのですが、ある程度の汎用性を確保したいのであれば curses というライブラリを用いる方法が一般的だと思います。 Windows でのことであればコンソール関係の API で制御することができます。

投稿2017/06/29 16:36

SaitoAtsushi

総合スコア5444

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daichi

2017/06/30 15:34

回答ありがとうございます! 早速cursesを調べて、様々な環境で動くようにしてみたいと思います。
guest

0

ベストアンサー

エスケープシーケンスで良いでしょうか?

cpp

1#include <thread> 2#include <iostream> 3#include <chrono> 4 5using namespace std; 6 7void progress_gauge(){ 8 string progress_1 = "progress_1.."; 9 string progress_2 = "progress_2.."; 10 cout << "starting.." << endl; 11 for( int i = 0;i < 10 ;i++) { 12 progress_1 += "#"; 13 progress_2 += "##"; 14 15 if (i > 0) 16 cout << "\x1b[A" << flush; 17 cout << progress_1 << "\r\n" << flush; 18 cout << progress_2 << "\r" << flush; 19 this_thread::sleep_for(chrono::seconds(1)); 20 } 21 22 cout << endl << "done." << endl; 23 24} 25 26int main() { 27 progress_gauge(); 28}

投稿2017/06/29 16:39

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daichi

2017/06/30 15:33

ありがとうございます!綺麗に動きました。 一つプログラムでお聞きしたいのですが、for文中のif文がない場合はprogress_1のみが増え続けていってしまいます。progress_2の方は綺麗に動くのですが。 このif文がどのような動作をしてるか教えていただけませんか?
mattn

2017/07/01 08:02

`\x1b[A` はカーソルを1行上に移動するエスケープシーケンスです。もともとの処理はカーソルを上に戻す処理を行っていなかったので画面をスクロールし続けていました。ですので progress1 を描画する際に progress2 描画終了位置にあったカーソルを戻しているのです。ただこの上に戻るのは2回目からでよいはずなので `i > 0` という if 文になっている訳です。 で、なぜ `\x1b[A` を描画後でなく描画前にやるかですが、CTRL-C を押すとプログラムが止まりますがその際に1行目にカーソルがあると2行目にかぶった状態でプログラムが終わってしまいます。そうならない為にカーソルは常に progress2 側にいる事にして、描画寸前に progress1 の位置に戻しているのです。 こんな説明でお判りいただけたでしょうか。
Daichi

2017/10/05 10:12

回答が非常に遅くなり申し訳ありません。 回答いただいた説明で理解致しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問