我正在完成我正在研究的c ++项目,以接收用户输入,计算一些值,然后将所有数据写入文件。我的问题是我无法在文本文件中获取正确对齐的值。我正在使用setw(),但是当用户输入的长度未知时,这不能正确对齐所有内容。它只是弄乱了列并使它们不对齐。
我尝试使用固定运算符,左对齐,右对齐,没有太多运气
这是我有关写入文件的代码。
if (myfile.is_open()){
myfile << "BASKETBALL COURTS AREA REPORT\n\n";
myfile << "Court" << setw(25) << "Height" << setw(25) << "Width\n";
for(int i=0; i<n; i++){
myfile << names[i] << setw(25) << " " << arr1[i] << setw(25) << arr2[i] <<"\n\n";
}
}
myfile << "\nThe largest court is " << maxName << ": " << maximum << "\n" << "\n";
myfile << "Total area covered by all courts: " << totalArea;
I expect the columns to be completely aligned like in this picture:
However the actual output looks more like this:
如果有人可以帮助我做些什么,我将不胜感激。非常感谢您的宝贵时间!
答案 0 :(得分:1)
第一个(最明显的)问题是您没有为法院名称设置字段宽度。默认情况下,它设置为0,因此每个名称都以显示整个名称所需的最小宽度打印。在那之后,设置其他列的宽度并没有太大帮助。
要设置宽度,您可能需要遍历所有项目,找到最宽的项目,然后添加一些额外的空格以在列之间留出一定的空白。
#include <iostream>
#include <sstream>
#include <iomanip>
#include <ios>
#include <string>
#include <algorithm>
#include <vector>
struct court {
std::string name;
int height;
int width;
};
int main() {
std::vector<court> courts {
{ "Auburn park", 12, 16},
{ "Alabama", 14, 17},
{"Wilsonville Stadium", 51, 123}
};
auto w = std::max_element(courts.begin(), courts.end(), [](court const &a, court const &b) { return a.name.length() < b.name.length(); })->name.length();
for (auto const &c : courts) {
std::cout << std::left << std::setw(w+5) << c.name
<< std::right << std::setw(5) << c.height
<< std::setw(5) << c.width << "\n";
}
}
结果:
Auburn park 12 16
Alabama 14 17
Wilsonville Stadium 51 123