Поэтому я должен отправить 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 ++, так что, ожидайте, что есть какое-то простое решение, которое я еще не изучил?
Есть ли способ сгруппировать все эти символы и переменные вместе, чтобы они все были выровнены вместе в столбце вывода?
Да, вы можете использовать небольшую вспомогательную функцию для построения строки:
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);
Одна возможность состоит в том, чтобы отформатировать элементы, составляющие поле, используя поток строк, а затем выписать эту строку с выравниванием вправо.
Что касается 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 и перезаписываете <<
способ сделать лучшее форматирование.
C ++, как правильно обосновать несколько частей данных?
Быстрый ответ: последовательно и отдельно для каждой части.
Хорошим началом будет знакомство с Манипуляторы ввода / вывода и их свойства. В вашем случае, когда вы подаете заявку setw
, он устанавливает флаг формата, и значение этого флага не является постоянным («липким»), но оно сбрасывается к своему начальному значению. Для более подробного анализа почему setw
кажется, сбросить после использования, посмотреть здесь.
Есть ли способ сгруппировать все эти символы и переменные вместе, чтобы они все были выровнены вместе в столбце вывода?
Теперь, для вашей конкретной проблемы, вы можете попробовать вставить все ваши данные в std::stringstream
объект, а затем применить требуемое свойство только один раз, как указано в других ответах.
Я только изучаю C ++, так что, ожидайте, что есть какое-то простое решение, которое я еще не изучил?
Самым простым решением было бы написать вспомогательную функцию, которая выполняет желаемую задачу, нет более простого (для меня) средства языка C ++ для выполнения того, что вы хотите.