すでに述べたように、問題を引き起こしているのはタブです。
ただし、タブを削除するだけでは終わりません。現状では、コードは非常に反復的であり、維持するのはほぼ不可能です。繰り返しを減らすためにいくつかの関数を使用して、(ほぼ) 完全に書き直します。私の最初のカットはおそらく次のようになります。
// format a value in a field of specified width, followed by a separator
template <class T>
string field(T val, int w, char sep = '|') {
stringstream b;
b << setw(w) << left << fixed << setprecision(3) << val << sep;
return b.str();
}
// generate a separator for a specified number of fields,
// each of a specified width
string sep(int c, int w, char val = '-') {
string s(c * (w + 1), val);
return string("\n") + s + "\n";
}
int main() {
static const int w = 8;
double F = 1.234, x = 3.45;
string s = sep(2, w);
cout << "\n" << s;
cout << field("F", w) << field("x", w) << s;
cout << field(F, w) << field(x, w) << s;
}
これにより、コードがかなり読みやすくなり、保守がかなり容易になるように思えます。たとえば、次の行にa
andを表示することにした場合b
、次のようなものを追加するのは明らかです。
cout << field(a, w) << field(b, w) << s;
...そして、前の行と一致するかどうかを確認するために、それほど難しく考える必要はありません。同様に、列幅などを変更したい場合。