Search code examples
c++coutiomanipsetw

Having trouble with iomanip, columns not lining up the way I expect


finishing up a long project and the final step is to make sure my data lines up in the proper column. easy. Only I am having trouble with this and have been at it for longer than i wish to admit watching many videos and can't really grasp what the heck to do So here is a little snippet of the code that I'm having trouble with:

 #include <iostream>
 #include <iomanip>   


 using namespace std;

 int main(){        

    cout << "Student Grade Summary\n";
    cout << "---------------------\n\n";
    cout << "BIOLOGY CLASS\n\n";
    cout << "Student                                   Final   Final Letter\n";
    cout << "Name                                      Exam    Avg   Grade\n";
    cout << "----------------------------------------------------------------\n";
    cout << "bill"<< " " << "joeyyyyyyy" << right << setw(23) 
         << "89" << "      " << "21.00" << "   "
         << "43" << "\n";
    cout << "Bob James" << right << setw(23)  
         << "89" << "      " << "21.00" << "   "
         << "43" << "\n";
    }

which works for the first entry but the bob james entry has the numbers all askew. I thought setw was supposed to allow you to ignore that? What am i missing? Thanks


Solution

  • It doesn't work as you think. std::setw sets the width of the field only for the next insertion (i.e., it is not "sticky").

    Try something like this instead:

    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    int main() {
    
        cout << "Student Grade Summary\n";
        cout << "---------------------\n\n";
        cout << "BIOLOGY CLASS\n\n";
    
        cout << left << setw(42) << "Student" // left is a sticky manipulator 
             << setw(8) << "Final" << setw(6) << "Final"
             << "Letter" << "\n";
        cout << setw(42) << "Name"
             << setw(8) << "Exam" << setw(6) << "Avg"
             << "Grade" << "\n";
        cout << setw(62) << setfill('-') << "";
        cout << setfill(' ') << "\n";
        cout << setw(42) << "bill joeyyyyyyy"
             << setw(8) << "89" << setw(6) << "21.00"
             << "43" << "\n";
        cout << setw(42) << "Bob James"
             << setw(8) << "89" << setw(6) << "21.00"
             << "43" << "\n";
    }
    

    Also related: What's the deal with setw()?