C使用cout设置列
作者:互联网
所以我刚开始学习c,我很好奇,如果它是一种用cout合成你的输出的方法,所以它看起来很漂亮,并且在列中结构化
例如.
string fname = "testname";
string lname = "123";
double height = 1.6;
string fname2 = "short";
string lname2 = "123";
double height2 = 1.8;
cout << "Name" << setw(30) << "Height[m]" << endl;
cout << fname + " " + lname << right << setw(20) << setprecision(2) << fixed << height << endl;
cout << fname2 + " " + lname2 << right << setw(20) << setprecision(2) << fixed << height2 << endl
输出如下所示:
Name Height[m]
testname 123 1.60
short 123 1.80
我希望它看起来像这样:
Name Height[m]
testname 123 1.60
short 123 1.80
我试图解决的问题是,我想将高度放在名称的特定位置,但是取决于我所采用的高度值的名称长度要么远离右边,要么非常接近左边.有没有办法来解决这个问题?
解决方法:
首先,使用像std :: cout这样的输出流,您无法及时返回并修改已执行的输出.这是有道理的 – 想象一下std :: cout写入一个文件,因为你用program.exe启动你的程序> test.txt和test.txt在USB驱动器上,同时已断开连接…
所以你必须马上把它弄好.
基本上,有两种方法可以做到这一点.
您可以假设第一列中的任何条目都不会超过一定数量的字符,这是您尝试过的.问题是你的setw处于错误的位置并且该权利应该被保留.必须在要受影响的元素之前放置流操纵器.既然你想要左对齐的列,你需要左:
cout << left << setw(20) << "Name" << "Height[m]" << endl;
cout << left << setw(20) << fname + " " + lname << setprecision(2) << fixed << height << endl;
cout << left << setw(20) << fname2 + " " + lname2 << setprecision(2) << fixed << height2 << endl;
但这种解决方案并不是很普遍.如果你的名字有21个字符怎么办?或者有30个字符?还是100个字符?您真正想要的是一种解决方案,其中列自动设置为只需要的宽度.
唯一的方法是在打印之前收集所有条目,找到最长的条目,相应地设置列宽,然后才打印所有条目.
以下是此想法的一种可能实现:
std::vector<std::string> const first_column_entries
{
"Name",
fname + " " + lname,
fname2 + " " + lname2
};
auto const width_of_longest_entry = std::max_element(std::begin(first_column_entries), std::end(first_column_entries),
[](std::string const& lhs, std::string const& rhs)
{
return lhs.size() < rhs.size();
}
)->size();
// some margin:
auto const column_width = width_of_longest_entry + 3;
std::cout << std::left << std::setw(column_width) << "Name" << "Height[m]" << "\n";
std::cout << std::left << std::setw(column_width) << fname + " " + lname << std::setprecision(2) << std::fixed << height << "\n";
std::cout << std::left << std::setw(column_width) << fname2 + " " + lname2 << std::setprecision(2) << std::fixed << height2 << "\n";
演化的下一步是将std :: vector推广到一个名为Table的自编写类中,并在循环中迭代Table的行以打印条目.
标签:c,cout,multiple-columns,setw 来源: https://codeday.me/bug/20190829/1762068.html