У меня есть пользовательский тип данных, представляющий строку:
struct ByteArray {
uint32_t len;
uint8_t* ptr;
}
и оператор переопределения << для вывода его на экран. </p>
Версия 1:
ostream &operator<<(ostream &os, const ByteArray &dt) {
os << string((const char*)dt.ptr,dt.len);
return os;
}
Версия 2:
ostream &operator<<(ostream &os, const ByteArray &dt) {
os.write((const char *) dt.ptr, dt.len);
auto fill = os.width() - dt.len;
fill_n(std::ostream_iterator<char>(os), fill, os.fill());
return os;
}
Мой код для вывода выглядит примерно так:
ByteArray& value = ...; // a string of length 25
cout << '|' << left << setw(40) << value;
Когда я использую версию 1, она работает хорошо и отображает:
|gAaNbDxVTyFjjhgGodAKyy9uk
Но версия 2 отображает 17 ведущих пробелов:
| gAaNbDxVTyFjjhgGodAKyy9uk
Я хочу использовать версию 2, поскольку она не создает ненужных строковых объектов. Но как мне правильно обрабатывать setw и заполнять?
Спасибо!
Обновление:
Когда я вывожу несколько строк, они выровнены по левому краю, но имеют 17 пробелов перед фактическими данными. Пожалуйста, смотрите пример ниже. Этот вывод генерируется кодом версии 2 выше. Фактическая ширина составляет 95, когда я устанавливаю ширину 40.
| gAaNbDxVTyFjjhgGodAKyy9uk |
| wMEzrsX2KKpTaJGE3uGEUibymG |
| 8cRzJOxCG7z qpfkXKgrQs6ubfOTK |
| A5a1lovY,yQoSHaYon5cGgo1l |
| f1mPa2ts2TUCbZ9UVmuDuu2lXLgfYTP |