如前所述,导致问题的是选项卡。
不过,我不会只删除标签。就目前而言,您的代码高度重复,几乎无法维护。我会做一个(几乎)完整的重写,用几个函数来减少重复。我的第一个剪辑可能看起来像这样:
// 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
和b
,添加类似这样的内容似乎相当明显:
cout << field(a, w) << field(b, w) << s;
...而且我们不必非常努力地确定它会与前一行匹配。同样,如果我们想更改列宽等。