使用set-width对齐列

时间:2018-12-10 22:14:22

标签: c++

我正在尝试正确对齐此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

2 个答案:

答案 0 :(得分:2)

您可以尝试使用制表符\ t来正确对齐列表。 这是您可能要查看的链接:How many spaces for tab character(\t)?

否则,您将不得不做

cout << "text" << setw(#) << "text" << setw(#) << endl;

我不建议这样做,因为它只是对设置的数字及其乏味进行硬编码,因为您必须计算并确保其正确匹配。

答案 1 :(得分:1)

正如Xion的答案所述,为正确对齐文本而对的正确值进行硬编码的过程非常繁琐。此外,对于其他数据集,它甚至可能根本不正确-例如,如果某人的名字比预期的大得多,会发生什么?

我的建议如下:完全迭代一次数据,并将每个字段的最大宽度存储在一个单独的变量中(还存储检索到的数据)。

此后,您可以再次在输入上循环,现在所有内容都将正确对齐,因为您现在知道每个字段的最大宽度(包括事先不用猜测标题列的正确间距,这将是理想的)。

您可以创建此信息的对象并将其存储在std::vector中,也可以对每个单独的数据字段执行相同操作,并为每个数据字段提供一个矢量。