2012-07-04 2 views
3

Я часто сталкиваюсь с ситуацией, когда хочу напечатать 2d-массив на экране или файле. Мой стандартный подход заключается в следующем:cout: согласованное расстояние с зацикленными выражениями cout

for(int q=0; q<x; q++) 
{ 
    cout << "\n"; 
    for(int w=0; w<y; w++) 
     cout << number[q][w] << "\t"; 
} 

Однако, когда элементы number изменяются по длине, как правило, это приводит к колоннам не выровнены должным образом. Как я могу добавить правильное количество пробелов после (или до) каждого номера, чтобы строки столбцов совпадали?

ответ

8

std::setw(), std::left and std::right.

#include <iostream> 
#include <iomanip> 

void printNumber(int x) { 
    std::cout << "X:" << std::setw(6) << x << ":X\n"; 
} 

void printStuff() { 
    printNumber(528); 
    printNumber(3); 
    printNumber(73826); 
    printNumber(37); 
} 

int main() { 
    std::cout << "Left-aligned\n"; 
    std::cout << std::left; 
    printStuff(); 
    std::cout << "Right-aligned\n"; 
    std::cout << std::right; 
    printStuff(); 
} 

Выход:

Left-aligned 
X:528 :X 
X:3  :X 
X:73826 :X 
X:37 :X 
Right-aligned 
X: 528:X 
X:  3:X 
X: 73826:X 
X: 37:X 

(Демонстрация:. http://ideone.com/6IdIc)

В этом примере я использовал 6 в качестве максимальной ширины ожидаемой. Если вы не знаете максимума, вам нужно либо выполнить первоначальный проход через свои данные, чтобы узнать, либо использовать максимально возможное для типа данных, которое вы используете (чтобы сделать этот перенос, вы можете использовать std::numeric_limits<T>::max).

+0

Отличный ответ Оли. Дополнительные детали очень полезны. –