我正在尝试正确对齐此C ++分配。主要目标是从文件中正确读取数据,这已经完成,但是输出未正确对齐。
有人建议将所有变量放入一个字符串中并逐行输出,但这似乎需要重新编写程序的大部分内容,但我不完全确定该怎么做。我已经附上了代码,输出如下所示。只是想知道是否有更好的方法在使用setwidth时保持所有内容对齐,或者是否存在另一种基本对齐方法。顺便说一下,文件的输入可以更改。
while (!PatientsFile.eof()) {
PatientsFile >> firstName;
PatientsFile >> lastName;
PatientsFile >> pulse;
PatientsFile >> respir;
PatientsFile >> oxygen;
PatientsFile >> room;
string name = firstName + ", " + lastName;
//patient info
cout << setw(4) << room << ' ';
cout << name;
//pulse
if (pulse >= 101) {
cout << setw(13) << "High=" << pulse << ' ';
dangerCount++; }
else if (pulse <= 59) {
cout << setw(16) << "Low=" << pulse << ' ';
dangerCount++; }
else {
cout << setw(19) << pulse << ' '; }
//respir
if (respir >= 21) {
cout << setw(5) << "High=" << respir << ' ';
dangerCount++; }
else if (respir <= 10) {
cout << setw(6) << "Low=" << respir << ' ';
dangerCount++; }
else {
cout << setw(7) << respir << ' '; }
//oxygen
if (oxygen >= 101) {
cout << setw(7) << "High=" << oxygen << ' ';
dangerCount++; }
else if (oxygen <= 91) {
cout << setw(5) << "Low=" << oxygen << ' ';
dangerCount++; }
else {
cout << setw(7) << oxygen << ' '; }
//dangerCount
if (dangerCount == 1) {
checkTotal++;
cout << "CHECK\n";}
else if (dangerCount == 2) {
alertTotal++;
cout << "ALERT***\n"; }
else if (dangerCount == 3) {
criticalTotal++;
cout << setw(15) << "CRITICAL****\n"; }
else {
normalTotal++;
cout << endl; }
dangerCount = 0;
}
//display totals
cout << endl << normalTotal << " Normal\n";
cout << alertTotal << " ALERT\n";
cout << checkTotal << " CHECK\n";
cout << criticalTotal << " CRITICAL\n";
输出:
Room Name Pulse Respir Oxygen
-----------------------------------------------------
111 Pete, Moss Low=59 11 Low=91 ALERT***
312 Diana, Canser High=107 Low=10 96 ALERT***
332 Willie, Makit High=123 High=30 94 ALERT***
111 Betty, Wont Low=50 Low=10 Low=90 CRITICAL****
331 Freda, Spirit High=110 High=23 Low=90 CRITICAL****
321 Wilma, Moneylast High=132 18 Low=88 ALERT***
121 Robin, Banks Low=59 20 100 CHECK
122 Charlie, Horse Low=56 15 95 CHECK
121 Eileen, Back Low=45 17 Low=88 ALERT***
222 Eaton, Buggs 79 16 97
222 Summer, Day 60 12 92
231 Bea, Sting 73 High=21 Low=91 ALERT***
311 Anita, Bath High=111 High=33 97 ALERT***
232 April, Showers 61 High=22 93 CHECK
222 Rose, Bush 100 20 100
231 Buster, Leggs 88 High=44 Low=88 ALERT***
221 Barb, Wire 60 12 Low=82 CHECK
322 Jim, Shoos High=101 19 94 CHECK
322 Kris, Mass Low=4 14 99 CHECK
222 Rich, Bright 77 16 92
4 Normal
8 ALERT
6 CHECK
2 CRITICAL
答案 0 :(得分:2)
您可以尝试使用制表符\ t来正确对齐列表。 这是您可能要查看的链接:How many spaces for tab character(\t)?
否则,您将不得不做
cout << "text" << setw(#) << "text" << setw(#) << endl;
我不建议这样做,因为它只是对设置的数字及其乏味进行硬编码,因为您必须计算并确保其正确匹配。
答案 1 :(得分:1)
正如Xion的答案所述,为正确对齐文本而对的正确值进行硬编码的过程非常繁琐。此外,对于其他数据集,它甚至可能根本不正确-例如,如果某人的名字比预期的大得多,会发生什么?
我的建议如下:完全迭代一次数据,并将每个字段的最大宽度存储在一个单独的变量中(还存储检索到的数据)。
此后,您可以再次在输入上循环,现在所有内容都将正确对齐,因为您现在知道每个字段的最大宽度(包括事先不用猜测标题列的正确间距,这将是理想的)。
您可以创建此信息的对象并将其存储在std::vector
中,也可以对每个单独的数据字段执行相同操作,并为每个数据字段提供一个矢量。