35

よくわかりませんが、Javaには、文字列または数字が始まるウィンドウの左側からどれだけ離れているかを指定できるものがあったことを覚えていると思います。

テーブルを簡単にフォーマットする方法は?私はこれを持っています(setwを使用して):

Bob Doe     10.96      7.61     14.39      2.11     47.30     14.21     44.58      5.00     60.23
Helen City     10.44      7.78     16.27      1.99     48.92     13.93     53.79      5.00     70.97
Joe Green     10.90      7.33     14.49      2.05     47.91     14.15     44.45      4.70     73.98

そして理想的には:

Bob           Doe        BLR  10.96   7.61  14.39   2.11  47.30  14.21  44.58   5.00  60.23  4:27.47
Helen         City       CUB  10.90   7.33  14.49   2.05  47.91  14.15  44.45   4.70  73.98  4:29.17
Joe           Green      USA  10.44   7.78  16.27   1.99  48.92  13.93  53.79   5.00  70.97  5:06.59

計算する唯一の方法はありますか?それとも、もっと簡単な魔法の方法はありますか?

4

7 に答える 7

58

C ++には、やりたいことを実行するのに役立つ3つの関数があります。で定義されてい<iomanip>ます。
--setw ()は、出力の幅を定義するのに役立ちます。
--setfill ()残りを必要な文字(あなたの場合は'')で埋めます。
-(または右)では、配置を定義できます。

これがあなたの最初の行を書くためのコードです:

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    const char separator    = ' ';
    const int nameWidth     = 6;
    const int numWidth      = 8;

    cout << left << setw(nameWidth) << setfill(separator) << "Bob";
    cout << left << setw(nameWidth) << setfill(separator) << "Doe";
    cout << left << setw(numWidth) << setfill(separator) << 10.96;
    cout << left << setw(numWidth) << setfill(separator) << 7.61;
    cout << left << setw(numWidth) << setfill(separator) << 14.39;
    cout << left << setw(numWidth) << setfill(separator) << 2.11;
    cout << left << setw(numWidth) << setfill(separator) << 47.30;
    cout << left << setw(numWidth) << setfill(separator) << 14.21;
    cout << left << setw(numWidth) << setfill(separator) << 44.58;
    cout << left << setw(numWidth) << setfill(separator) << 5.00;
    cout << left << setw(numWidth) << setfill(separator) << 60.23;
    cout << endl;

    cin.get();
}


編集: コードを減らすために、テンプレート関数を使用できます:

template<typename T> void printElement(T t, const int& width)
{
    cout << left << setw(width) << setfill(separator) << t;
}

あなたがこのように使うことができること:

printElement("Bob", nameWidth);
printElement("Doe", nameWidth);
printElement(10.96, numWidth);
printElement(17.61, numWidth);
printElement(14.39, numWidth);
printElement(2.11, numWidth);
printElement(47.30, numWidth);
printElement(14.21, numWidth);
printElement(44.58, numWidth);
printElement(5.00, numWidth);
printElement(60.23, numWidth);
cout << endl;
于 2013-02-10T10:44:13.607 に答える
3

フィールドをフォーマットするには、書式指定子を指定してsprintf を使用するだけです。MFC CString を使用することもできます

#include <iostream>
#include "stdio.h"

using namespace std;

int main()
{
    char buf[256];
    char pattern[]  = "%10s %10s     %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f";
    sprintf(buf, pattern, "Bob",  "Doe",     10.96,      7.61,     14.39,      2.11,     47.30,     14.21,     44.58,      5.00,     60.23);
    cout << buf << endl;
    sprintf(buf, pattern, "Helen", "City",     10.44,      7.78,     16.27,      1.99,     48.92,     13.93,     53.79,      5.00,     70.97);
    cout << buf << endl;
    sprintf(buf, pattern, "Joe", "Green",     10.90,      7.33,     14.49,      2.05,     47.91,     14.15,     44.45,      4.70,     73.98);
    cout << buf << endl;
}
于 2013-02-18T13:51:59.440 に答える
1

プロセスを少し簡素化するために、このようなことを行うことができます。

#include <iomanip>
#include <iostream>

struct TableFormat {
    int width;
    char fill;
    TableFormat(): width(14), fill(' ') {}
    template<typename T>
    TableFormat& operator<<(const T& data) {
        std::cout << data << std::setw(width) << std::setfill(fill);
        return *this;
    }
    TableFormat& operator<<(std::ostream&(*out)(std::ostream&)) {
        std::cout << out;
        return *this;
    }
};

int main() {
    TableFormat out;
    out << "Bob" << "Doe";
    out.width = 8;
    out << "BLR" << 10.96 << 7.61 << 14.39 << 2.11 << 47.30;
}

どちらが出力されますか(私の場合は恐ろしく、ある程度「カスタマイズ可能」です):

Bob           Doe           BLR   10.96    7.61   14.39    2.11    47.3

コードは一目瞭然でstd::cout、退屈な呼び出しを簡単にするためのラッパーにすぎません.2番目のオーバーロードoperator<<は、std::endl..

于 2013-02-08T03:36:50.407 に答える
0

出力をテーブルのようにフォーマットする場合、必要なのはI/Oマニピュレータです。setw()
マニピュレータを 使用して出力幅を設定し、setfill()を使用して塗りつぶし文字を設定できます。

于 2013-02-08T03:22:47.253 に答える
0

例を考えます:

string firstname = "Bob";
string lastname = "Doe";
string country = "BLR";
float f1 = 10.96f, f2=7.61f, f3=14.39f, f4=2.11f, f5=47.30f, f6=14.21f, f7=44.58f, f8=5.00f, f9=60.23f;
string time = "4:27.47";
cout << setw(12) << firstname << set(12) << lastname;
cout << setw(5) << country << setprecision(2) << f1 << setprecision(2) << f2 << setprecision(2) << f3..
  1. setw()文字列を印刷する際に幅を設定するために使用します
  2. setprecision浮動小数点値の精度を設定するために使用します
  3. MSDNを読む
于 2013-02-08T03:37:36.960 に答える
0

何を書いたのかわからないので何が悪いのかわかりませんが、std::setw で必要な結果を得ることができます。

#include <iostream>
#include <iomanip>

int main() {
   std::cout << std::left << std::setw(20) << "BoB" << std::setw(20) << 123.456789 << '\n';
   std::cout << std::left << std::setw(20) << "Richard" << std::setw(20) << 1.0 << '\n';
}

http://ideone.com/Iz5RXr

于 2013-02-08T03:39:00.037 に答える