使用 iomanip 时遇到问题,列未按我预期的方式排列
Having trouble with iomanip, columns not lining up the way I expect
完成一个长项目,最后一步是确保我的数据排列在正确的列中。简单。只有我在这方面遇到了麻烦,而且我在这方面的时间比我承认观看了很多视频的时间还要长,而且我真的不知道该怎么做所以这是我遇到问题的一小段代码:
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
cout << "Student Grade Summary\n";
cout << "---------------------\n\n";
cout << "BIOLOGY CLASS\n\n";
cout << "Student Final Final Letter\n";
cout << "Name Exam Avg Grade\n";
cout << "----------------------------------------------------------------\n";
cout << "bill"<< " " << "joeyyyyyyy" << right << setw(23)
<< "89" << " " << "21.00" << " "
<< "43" << "\n";
cout << "Bob James" << right << setw(23)
<< "89" << " " << "21.00" << " "
<< "43" << "\n";
}
这适用于第一个条目,但 bob james 条目的数字全都歪了。我以为 setw 应该让你忽略它?我错过了什么?
谢谢
并不是你想的那样。 std::setw
仅为下一次插入设置字段宽度(即 it is not "sticky")。
试试这样的方法:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
cout << "Student Grade Summary\n";
cout << "---------------------\n\n";
cout << "BIOLOGY CLASS\n\n";
cout << left << setw(42) << "Student" // left is a sticky manipulator
<< setw(8) << "Final" << setw(6) << "Final"
<< "Letter" << "\n";
cout << setw(42) << "Name"
<< setw(8) << "Exam" << setw(6) << "Avg"
<< "Grade" << "\n";
cout << setw(62) << setfill('-') << "";
cout << setfill(' ') << "\n";
cout << setw(42) << "bill joeyyyyyyy"
<< setw(8) << "89" << setw(6) << "21.00"
<< "43" << "\n";
cout << setw(42) << "Bob James"
<< setw(8) << "89" << setw(6) << "21.00"
<< "43" << "\n";
}
还相关:What's the deal with setw()?
操纵者 << right << setw(23)
正在告诉 ostream
你想要的
字符串“89”设置在一个 23 个字符宽的字段的右边缘。
没有什么可以告诉 ostream 你想要那个字段 start,
但是,除了自
最后换行。
<< "bill"<< " " << "joeyyyyyyy"
向输出写入更多字符
比 << "Bob James"
做的,所以第二行的 23 个字符宽的字段
从第一行同一字段的左侧开始。
流操纵器影响下一个 input/output 值被流式传输,然后一些操纵器(包括 setw()
)随后重置。所以你需要在输出文本字符串之前设置宽度和对齐方式,而不是之后。
试试像这样的东西:
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
void outputStudent(const string &firstName, const string &lastName,
int finalExam, float finalAvg, int letterGrade)
{
cout << setw(40) << left << (firstName + " " + lastName) << " "
<< setw(6) << right << finalExam << " "
<< setw(6) << right << fixed << setprecision(2) << finalAvg << " "
<< setw(7) << right << letterGrade << "\n";
}
int main()
{
cout << "Student Grade Summary\n";
cout << "---------------------\n\n";
cout << "BIOLOGY CLASS\n\n";
cout << "Student Final Final Letter\n";
cout << "Name Exam Avg Grade\n";
cout << "--------------------------------------------------------------\n";
outputStudent("bill", "joeyyyyyyy", 89, 21.00, 43);
outputStudent("Bob", "James", 89, 21.00, 43);
cin.get();
return 0;
}
输出:
Student Grade Summary
---------------------
BIOLOGY CLASS
Student Final Final Letter
Name Exam Avg Grade
--------------------------------------------------------------
bill joeyyyyyyy 89 21.00 43
Bob James 89 21.00 43
完成一个长项目,最后一步是确保我的数据排列在正确的列中。简单。只有我在这方面遇到了麻烦,而且我在这方面的时间比我承认观看了很多视频的时间还要长,而且我真的不知道该怎么做所以这是我遇到问题的一小段代码:
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
cout << "Student Grade Summary\n";
cout << "---------------------\n\n";
cout << "BIOLOGY CLASS\n\n";
cout << "Student Final Final Letter\n";
cout << "Name Exam Avg Grade\n";
cout << "----------------------------------------------------------------\n";
cout << "bill"<< " " << "joeyyyyyyy" << right << setw(23)
<< "89" << " " << "21.00" << " "
<< "43" << "\n";
cout << "Bob James" << right << setw(23)
<< "89" << " " << "21.00" << " "
<< "43" << "\n";
}
这适用于第一个条目,但 bob james 条目的数字全都歪了。我以为 setw 应该让你忽略它?我错过了什么? 谢谢
并不是你想的那样。 std::setw
仅为下一次插入设置字段宽度(即 it is not "sticky")。
试试这样的方法:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
cout << "Student Grade Summary\n";
cout << "---------------------\n\n";
cout << "BIOLOGY CLASS\n\n";
cout << left << setw(42) << "Student" // left is a sticky manipulator
<< setw(8) << "Final" << setw(6) << "Final"
<< "Letter" << "\n";
cout << setw(42) << "Name"
<< setw(8) << "Exam" << setw(6) << "Avg"
<< "Grade" << "\n";
cout << setw(62) << setfill('-') << "";
cout << setfill(' ') << "\n";
cout << setw(42) << "bill joeyyyyyyy"
<< setw(8) << "89" << setw(6) << "21.00"
<< "43" << "\n";
cout << setw(42) << "Bob James"
<< setw(8) << "89" << setw(6) << "21.00"
<< "43" << "\n";
}
还相关:What's the deal with setw()?
操纵者 << right << setw(23)
正在告诉 ostream
你想要的
字符串“89”设置在一个 23 个字符宽的字段的右边缘。
没有什么可以告诉 ostream 你想要那个字段 start,
但是,除了自
最后换行。
<< "bill"<< " " << "joeyyyyyyy"
向输出写入更多字符
比 << "Bob James"
做的,所以第二行的 23 个字符宽的字段
从第一行同一字段的左侧开始。
流操纵器影响下一个 input/output 值被流式传输,然后一些操纵器(包括 setw()
)随后重置。所以你需要在输出文本字符串之前设置宽度和对齐方式,而不是之后。
试试像这样的东西:
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
void outputStudent(const string &firstName, const string &lastName,
int finalExam, float finalAvg, int letterGrade)
{
cout << setw(40) << left << (firstName + " " + lastName) << " "
<< setw(6) << right << finalExam << " "
<< setw(6) << right << fixed << setprecision(2) << finalAvg << " "
<< setw(7) << right << letterGrade << "\n";
}
int main()
{
cout << "Student Grade Summary\n";
cout << "---------------------\n\n";
cout << "BIOLOGY CLASS\n\n";
cout << "Student Final Final Letter\n";
cout << "Name Exam Avg Grade\n";
cout << "--------------------------------------------------------------\n";
outputStudent("bill", "joeyyyyyyy", 89, 21.00, 43);
outputStudent("Bob", "James", 89, 21.00, 43);
cin.get();
return 0;
}
输出:
Student Grade Summary
---------------------
BIOLOGY CLASS
Student Final Final Letter
Name Exam Avg Grade
--------------------------------------------------------------
bill joeyyyyyyy 89 21.00 43
Bob James 89 21.00 43