为什么输出提前结束该行并用 setfill 填充每个空白空间而不是用它创建一行?

问题描述

我正在尝试创建一个特殊字符“=”

我想要的输出

Name====================
Horace Horsecollar    56.00  12.50  700.00  210.00  10  480.00
Eleven Thirty         34.00  12.50  425.00  127.50  10  287.50
Victoria Elven        34.00  12.50  425.00  127.50  10  287.50

但是这里的输出用“=”填充了输出中的所有空格

我得到的输出

Name
==Horace Horsecollar====56.00  12.50  700.00  210.00  10  480.00
Eleven Thirtyman======34.00  12.50  425.00  127.50  10  287.50
Victoria Elven========34.00  12.50  425.00  127.50  10  287.50

Employees.push_back(new Employee("Horace Horsecollar",56,12.5));
Employees.push_back(new Employee("Eleven",34,12.5));
Employees.push_back(new Employee("Victoria Elven",12.5));

代码

cout << "Name" << setw(20) << setfill('=') << endl;

for (vector<Employee *>::iterator i = Employees.begin(); i < Employees.end(); i++) {
  cout << (*i)->getName() 
  
  << setw(27 - ((*i)->getNamesize()) ) << fixed << setprecision(2) 
  << (*i)->getHoursWorked() 
  << "  " << (*i)->getHourlyRate() 
  << "  " << (*i)->getGrosspay()
  << "  " << (*i)->getTaxes()
  << "  " << 10
  << "  " << (*i)->getNetPay() << "\n";

我真的很困惑,关于 cout 有一些我不明白的东西,但我不知道它是什么。

解决方法

感谢您的评论,他们真的很有帮助

我在行的最后遗漏了一个“=”以使其完整

cout << "Name" << setw(17) << setfill('=') << "=" << setfill(' ') << endl;

输出

Name=================
Horace Horsecollar    56.00  12.50  700.00  210.00  10  480.00
Eleven Thirty         34.00  12.50  425.00  127.50  10  287.50
Victoria Elven        34.00  12.50  425.00  127.50  10  287.50
,

您需要在文本之前放置格式化程序。










cout << setw(21) << setfill('=') << left << "Name" << setfill(' ') << endl;

left 关键字表示以下文本将排列在 21 个字符的列的左侧。填充字符将在右侧。

这也适用于打印名称的循环的第一部分。 setw() 的全部意义在于您不需要处理列中数据的长度。

for (vector<Employee *>::iterator i = Employees.begin(); i < Employees.end(); i++) {
  cout << setw(22) << left << (*i)->getName() 
       << fixed << setprecision(2) << (*i)->getHoursWorked() 
       << "  " << (*i)->getHourlyRate()
       << "  " << (*i)->getGrossPay()
       << "  " << (*i)->getTaxes()
       << "  " << 10
       << "  " << (*i)->getNetPay() << "\n";
}

在这里,名称将放在 22 个字符的列的左侧。由于在 Name 标题后调用了 setfill(' '),其余空间被空格占用。