用C++排列文本输出

Line up text output in C++

本文关键字:输出 文本 排列 C++      更新时间:2023-10-16

所以我有一个从文本文件读取并输出到另一个文本文件的程序。这是它读取的文件文本(包括格式):

Duckey Donald 85
Goof Goofy 89
Brave Balto 93
Snow Smitn 93
Alice Wonderful 89
Samina Akthar 85
Simba Green 95
Donald Egger 90
Brown Deer 86
Johny Jackson 95
Greg Gupta 75
Samuel Happy 80
Danny Arora 80
Sleepy June 70
Amy Cheng 83
Shelly Malik 95
Chelsea Tomek 95
Angela Clodfelter 95
Allison Nields 95
Lance Norman 88

在程序中,它将这些元素中的每一个添加到数组中的一个结构中;然后计算等级并打印。

cout << "Student Name           Test Score  Grade" << endl;
for (int studentNumber = 0; studentNumber < STUDENT_NUMBER; studentNumber++){
    cout << students[studentNumber].studentLName << ", "
         << students[studentNumber].studentFName << "           "
         << students[studentNumber].testScore << "      "
         << students[studentNumber].grade << endl;
}

所需输出如下:

Student Name           Test Score  Grade
Donald, Duckey               85      B
Goofy, Goof                  89      B
Balto, Brave                 93      A
Smitn, Snow                  93      A
Wonderful, Alice             89      B
Akthar, Samina               85      B
Green, Simba                 95      A
Egger, Donald                90      A
Deer, Brown                  86      B
Jackson, Johny               95      A
Gupta, Greg                  75      C
Happy, Samuel                80      B
Arora, Danny                 80      B
June, Sleepy                 70      C
Cheng, Amy                   83      B
Malik, Shelly                95      A
Tomek, Chelsea               95      A
Clodfelter, Angela           95      A
Nields, Allison              95      A
Norman, Lance                88      B
Highest Test Score: 95
Students having the highest test score:
Green,  Simba
Jackson,  Johny
Malik,  Shelly
Tomek,  Chelsea
Clodfelter,  Angela
Nields,  Allison

所以基本上我的问题是。。。有没有办法让测试分数列的整数像我上面想要的输出一样排列

解决方案

int colWidth = 20;
    for (int studentNumber = 0; studentNumber < STUDENT_NUMBER; studentNumber++){
    string s = students[studentNumber].studentFName  + ", " + students[studentNumber].studentLName;
    int size = s.size();
         cout <<  s << std::string(colWidth - size, ' ')
         << students[studentNumber].testScore << "    "
         <<

您可以手动用空格填充字符串,如:

#include <string>
#include <iostream>
int main()
{
    std::string first("John");
    std::string last("Smith");
    std::string full = last + ", " + first;
    int colWidth = 20;
    std::cout << "12345678901234567890n"
              << full << std::string(colWidth - full.size(), ' ')
              << "aligned after 20 charactersn";
    return 0;
}

输出:

12345678901234567890
Smith, John         aligned after 20 characters

如果你计算打印的字符数,这将适用于左对齐你的文本。

对于正确的证明,std::setw<iomanip>可以很好地工作。与其他流操纵器不同,std::setw不具有粘性,因此它只会修改您的下一个即时输出。

#include <string>
#include <iostream>
#include <iomanip>
int main()
{
    std::string s("ABCDE");
    int colWidth = 20;
    std::cout << "12345678901234567890n";
    std::cout << std::setw(colWidth) << s << "n";
    return 0;
}

打印

12345678901234567890
               ABCDE

综合起来,我会左对齐第一列,右对齐第二列和第三列。

#include <string>
#include <iostream>
#include <iomanip>
int main()
{
    std::string first("John");
    std::string last("Smith");
    std::string full = last + ", " + first;
    int score = 100;
    std::string grade("A");
    std::cout << "123456789012345678901234512345n"
              << full << std::string(20 - full.size(), ' ')
              << std::setw(5) << score
              << std::setw(5) << grade << "n";
    return 0;
}

打印:

123456789012345678901234512345
Smith, John           100    A

您可以这样更改代码:

#include <iomanip>
cout << "Student Name           Test Score  Grade" << endl;
for (int studentNumber = 0; studentNumber < STUDENT_NUMBER; studentNumber++){
    cout << setiosflags(ios::left) << setw(29) << setfill(' ') 
        << students[studentNumber].studentLName + ", " + students[studentNumber].studentFName 
        << setw(8) << students[studentNumber].testScore 
        << students[studentNumber].grade << endl;
}

其中298是根据您不期望的输出格式计算的,您可以根据需要进行更改。