C++ で出力を右揃え

胡金庫 2023年10月12日
  1. C++ で std::rightstd::setw を使用して出力を右揃えにする
  2. C++ で出力を右揃えにするには printf 関数を使用する
C++ で出力を右揃え

この記事では、C++ で出力ストリームを右寄せする方法について複数のメソッドを示します。

C++ で std::rightstd::setw を使用して出力を右揃えにする

C++ 標準ライブラリには、<< >> 演算子を用いてストリームをよりよく制御するための I/O マニピュレータヘルパー関数が用意されており、<iomanip> ヘッダーファイルに含まれています。std::right は、塗りつぶし文字の位置を設定するストリームマニピュレータの一つです。したがって、std::setw マニピュレータ関数と併用する必要があります。std::setw は、ストリーム幅に割り当てる文字数を指定するために 1つの整数を引数に取ります。

次のコード例では、double のベクトルを精度の異なる任意の値で初期化し、コンソールの右端に揃えて出力しています。

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::right;
using std::setw;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    cout << right << setw(20) << fixed << i << endl;
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

  123.231000
    2.234300
    0.324000
    0.012000
   26.949109
11013.000000
   92.001112
    0.000000

C++ で出力を右揃えにするには printf 関数を使用する

I/O フォーマットを扱うもう一つの強力な関数が printf です。printfcin/cout ストリームでは使用されませんが、変数引数を個別にフォーマットすることができます。浮動小数点値には %f 形式の指定子を使用し、各要素に充填文字を追加するために任意の数 20 を使用していることに注意してください。その結果、各行は 20 文字幅となり、数値が正の値であるため、充填文字は左から追加されます。

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::right;
using std::setw;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    printf("%20f\n", i);
  }

  return EXIT_SUCCESS;
}

出力:

  123.231000
    2.234300
    0.324000
    0.012000
   26.949109
11013.000000
   92.001112
    0.000000

あるいは、書式指定子に負の整数を挿入して右側に文字を埋め、出力を左に正当化することもできます。printf のもう一つの強力な機能は、以下のサンプルコードで示されているように、リテラル文字列の値をフォーマットすることです。なお、%cchar の書式指定子であり、0x20 の値はスペース文字の 16 進数であることに注意してください。

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::right;
using std::setw;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    printf("%-20f\n", i);
  }

  printf("%60s\n", "this ought to be justified right");
  printf("%-20s|%20c|%20s\n", "wandering", 0x20, "the tower");

  return EXIT_SUCCESS;
}

出力:

123.231000          
2.234300            
0.324000            
0.012000            
26.949109           
11013.000000      
92.001112           
0.000000            
                            this ought to be justified right

wandering           |                    |           the tower
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ IO