2016-02-16 3 views
0

Я пытаюсь выровнять свой вывод, но по какой-то причине я не могу получить его до , как я этого хочу, и это действительно расстраивает. Заголовок не будет выравниваться вправо. Я не знаю, правильно ли использую setw().C++ iomanip Alignment

#include <iostream> 
using std::cout; 
using std::endl; 
#include <string> 
using std::string; 
#include <assert.h> 
#include <iomanip> 
using std::setw; 
using std::right; 
using std::left; 

//Movie Struct to hold movie data 
struct MOVIES 
{ 
    string Title; //Name of movie 
    int CriticRating; //Critic rating 1-100 
    int AudRating; //Audiences' rating 1-100 
}; 
MOVIES Movies[10] = { { "The Wizard of Oz", 99 , 70 }, 
         { "The Third Man" , 78, 45 }, 
         { "Citizen Kane" , 86, 85 }, 
         { "Charlie Chaplin in Modern Times", 56, 95 }, 
         { "All About Eve" , 78, 94 }, 
         { "The Cabinet of Dr. Caligari" , 76, 90 }, 
         { "The God Father" , 99 , 98 }, 
         { "E.T. The Extra-Terrestrial"  , 98 , 71 }, 
         { "The Beatles: A Hard Day's Night", 87 , 90 }, 
         { "Monty Python and the Holy Grail", 100, 100 } 
        }; 


void PrintMovies(MOVIES* movies, int numMovies) 
{ 
    cout << "Movies" << endl 
     << "Critic" << setw(10) 
     << "Audience" << setw(10) 
     << "Title" << endl; 

    for (int i = 0; i < numMovies; i++) 
    { 
     cout << setw(6); 
     cout << movies[i].CriticRating << right; 
     cout << setw(6); 
     cout << movies[i].AudRating << right; 
     cout << setw(6); 
     cout << movies[i].Title << left; 
     cout << endl; 
    }; 
} 

int main() 
{ 
    PrintMovies(Movies, 10); 

    return 0; 
} 

// Пример вывода о том, что мне нужно Results wanted

Однако это то, что я получаю вместо Unwanted result..

+1

Вы должны установить манипулятором выравнивания _перед_ вещь, которую вы хотите выровнены. То же самое с 'setw'. Вам нужно будет добавить пробел перед заголовком, чтобы он не заклинился с выровненными по правому краю номерами. – paddy

ответ

2

Если это то, что вы хотите

enter image description here

#include <iomanip> 
using std::setw; 
using std::right; 
using std::left; 

//Movie Struct to hold movie data 
struct MOVIES 
{ 
    string Title; //Name of movie 
    int CriticRating; //Critic rating 1-100 
    int AudRating; //Audiences' rating 1-100 
}; 
MOVIES Movies[10] = { { "The Wizard of Oz", 99, 70 }, 
{ "The Third Man", 78, 45 }, 
{ "Citizen Kane", 86, 85 }, 
{ "Charlie Chaplin in Modern Times", 56, 95 }, 
{ "All About Eve", 78, 94 }, 
{ "The Cabinet of Dr. Caligari", 76, 90 }, 
{ "The God Father", 99, 98 }, 
{ "E.T. The Extra-Terrestrial", 98, 71 }, 
{ "The Beatles: A Hard Day's Night", 87, 90 }, 
{ "Monty Python and the Holy Grail", 100, 100 } 
}; 


void PrintMovies(MOVIES* movies, int numMovies) 
{ 
    cout << " Critic " << setw(6) << " Audience " << setw(0) << " Title " << endl; 

    for (int i = 0; i < numMovies; i++) 
    { 
     cout << setw(7) << right << movies[i].CriticRating << setw(10) << right << movies[i].AudRating <<" "<< setw(30) << left << movies[i].Title << endl; 
    } 
} 

int main() 
{ 
    PrintMovies(Movies, 10); 

    return 0; 
} 
1

Как указано в комментариях, если вы хотите использовать std::setw() для установки ширины, вам нужно будет использовать его перед вводом своего «значения».

Например,

std::cout << "no setw: " << 42 << std::endl; 
std::cout << "setw(10): " << std::setw(10) << 42 << std::endl; 

Также вы должны установить ширину между каждой operator<<.

Если вы:

std::cout << std::setw(10) << 42 << "bar" << std::endl; 
std:: cout << std::setw(10) << 42 << std::setw(10) << "bar" << std::endl; 

вы соответственно получить выходы:

________42bar 
________42_______bar