C ++, как правильно обосновать несколько частей данных

Поэтому я должен отправить std::cout столбец данных, где я также должен отображать некоторые символы вокруг данных, как:

    Plot Points
(0,0), (2,3)
(1,10), (12,14)

где я должен правильно обосновать последнюю правильную скобку под буквой "s" в "Points" в заголовке столбца.

Я выкладываю данные как:

cout << right << setw(12) << "(" << x1 << "," << y1 << "), (" << x2 << "," << y2 << ")";

Но все примеры, которые я видел, показывают, что setw похоже, влияет только на следующий фрагмент данных, которые я отправляю coutтак что в этом случае "(" только.

Есть ли способ сгруппировать все эти символы и переменные вместе, чтобы они все были выровнены вместе в столбце вывода?

Я только изучаю C ++, так что, ожидайте, что есть какое-то простое решение, которое я еще не изучил?

6

Решение

Есть ли способ сгруппировать все эти символы и переменные вместе, чтобы они все были выровнены вместе в столбце вывода?

Да, вы можете использовать небольшую вспомогательную функцию для построения строки:

std::string parentized_pair(int x, int y) {
std::ostringstream oss;
oss << "(" << x "," << y << ")";
return oss.str();
}

и используйте это в конечном результате:

cout << right << setw(12) << parentized_pair(x1,y1)
<< right << setw(12) << parentized_pair(x2,y2);
6

Другие решения

Одна возможность состоит в том, чтобы отформатировать элементы, составляющие поле, используя поток строк, а затем выписать эту строку с выравниванием вправо.

2

Что касается AdjustField, вы можете использовать его следующим образом.

cout.setf(ios::right, ios::adjustfield);

В отношении width или же setw к сожалению, вам придется определить это перед каждым выводом.

Обратитесь к следующему примеру:

#include <iostream>

using namespace std;

int main () {
cout<<"Current fill character: " << cout.fill() <<", code: " <<(int)cout.fill()<<endl;
cout<<"Current field width : " << cout.width() <<endl;
cout<<1<<2<<3<<endl;
// changing width;
cout.width(3);
cout<<"Field width after change : " << cout.width() <<endl;
cout<<1<<2<<3<<endl;
cout<<"Width after output : " << cout.width() <<endl;
// changing width and fill
cout.width(3);
cout.fill('_');
cout<<"Current fill character: " << cout.fill() <<", code: " <<(int)cout.fill()<<endl;
cout<<1<<2<<3<<endl<<endl;

cout<<"Setting width before each write:\n";
cout<<"adjustfield - not set/default:\n";
for(unsigned i=1; i <= 3; ++i) {
cout.width(3);
cout<<i;
}
cout<<endl;

cout<<"adjustfield - left:\n";
cout.setf(ios::left, ios::adjustfield);
for(unsigned i=1; i <= 3; ++i) {
cout.width(3);
cout<<i;
}
cout<<endl;

cout<<"adjustfield - internal:\n";
cout.setf(ios::internal, ios::adjustfield);
for(unsigned i=1; i <= 3; ++i) {
cout.width(3);
cout<<i;
}
cout<<endl;

cout<<"adjustfield - right:\n";
cout.setf(ios::right, ios::adjustfield);
for(unsigned i=1; i <= 3; ++i) {
cout.width(3);
cout<<i;
}
cout<<endl;
return 0;
}
/*
Console output:

Current fill character:  , code: 32
Current field width : 0
123
Field width after change : 3
123
Width after output : 0
Current fill character: _, code: 95
123

Setting width before each write:
adjustfield - not set/default:
__1__2__3
adjustfield - left:
1__2__3__
adjustfield - internal:
__1__2__3
adjustfield - right:
__1__2__3
*/

Если вы можете предоставить больше информации о структуре данных, которую вы используете, или если вы можете изменить структуру данных, вы можете использовать эту идею в ответе πάντα ῥεῖ, например, Вы определяете класс / структуру Point и перезаписываете << способ сделать лучшее форматирование.

2

C ++, как правильно обосновать несколько частей данных?

Быстрый ответ: последовательно и отдельно для каждой части.


Хорошим началом будет знакомство с Манипуляторы ввода / вывода и их свойства. В вашем случае, когда вы подаете заявку setw, он устанавливает флаг формата, и значение этого флага не является постоянным («липким»), но оно сбрасывается к своему начальному значению. Для более подробного анализа почему setw кажется, сбросить после использования, посмотреть здесь.

Есть ли способ сгруппировать все эти символы и переменные вместе, чтобы они все были выровнены вместе в столбце вывода?

Теперь, для вашей конкретной проблемы, вы можете попробовать вставить все ваши данные в std::stringstream объект, а затем применить требуемое свойство только один раз, как указано в других ответах.

Я только изучаю C ++, так что, ожидайте, что есть какое-то простое решение, которое я еще не изучил?

Самым простым решением было бы написать вспомогательную функцию, которая выполняет желаемую задачу, нет более простого (для меня) средства языка C ++ для выполнения того, что вы хотите.


1
По вопросам рекламы [email protected]