Думайте об этом как об использовании Microsoft Excel :)
Вы думаете о своем потоке как о полях. Итак, сначала вы устанавливаете ширину поля, а затем вставляете свой текст в это поле. Например:
#include <iostream>
#include <iomanip>
#include <string>
int main()
{
using namespace std;
string firstName = "firstName",
secondName = "SecondName",
n = "Just stupid Text";
size_t fieldWidth = n.size(); // length of longest text
cout << setw(fieldWidth) << left << firstName << endl // left padding
<< setw(fieldWidth) << left << secondName << endl
<< setw(fieldWidth) << left << n << endl;
cout << setw(fieldWidth) << right << firstName << endl // right padding
<< setw(fieldWidth) << right << secondName << endl
<< setw(fieldWidth) << right << n << endl;
}
......
......
Ширина поля не означает ничего, кроме ширины text + spaces
. Вы можете fill
что угодно, кроме пробелов:
string name = "My first name";
cout << setfill('_') << setw(name.size() + 10) << left << name;
.....
output::
My first name__________
......
Я думаю, что лучший способ - это определить свой формат и написать новый форматер, который делает все, что вы хотите:
#include <iostream>
#include <iomanip>
#include <string>
std::ostream& field(std::ostream& o)
{
// usually the console is 80-character wide.
// divide the line into four fields.
return o << std::setw(20) << std::right;
}
int main()
{
using namespace std;
string firstName = "firstName",
secondName = "SecondName",
n = "Just stupid Text";
size_t fieldWidth = n.size();
cout << field << firstName << endl
<< field << secondName << endl
<< field << n << endl;
}
Если вы начали думать о параметризованных манипуляторах, легко реализовать только те, которые принимают один параметр int
или long
, другие типы действительно неясны, если вы не знакомы с потоками в C++
.