В предложенном вами коде:
cout<<a[x]<<setw(5)<<"|"<<setw(5)<<b[x]<<endl;
у вас есть две проблемы, которые приводят к смещению. (1) вы не указали ширину a[x]
, поэтому она будет выводиться без каких-либо настроек; и (2) в зависимости от искомого выравнивания, выравнивание по умолчанию, если ширина указана для std::cout
, будет right
выравнивание.
(кроме того, как отмечалось в моем комментарии, в вашем первом примере a[0]
и a[1]
не могут иметь одинаковую длину, как показано в примере. Там "frd "
сохраняется с дополнительными whitespace
(или "asd\b"
хранится со встроенным backspace
) в противном случае выходные данные "a[x]|"
будут выровнены.)
Чтобы обеспечить выравнивание для выходных данных a
и b
, необходимо указать, как минимум, ширину a[x]
с помощью std::setw(n)
. Кроме того, если вы не хотите выровнять a[x]
справа от поля, созданного std::setw(5)
, вы должны управлять выравниванием, установив std :: ios_base :: fmtflags с помощью std::setiosflags(std::ios_base::left)
(или просто * 1027). *). См. std :: setiosflags .
Когда вы устанавливаете флаг формата для потока, вы устанавливаете биты в типе Bitmap , который останется установленным после завершения текущего вызова std::cout
. Таким образом, чтобы привести себя в порядок и восстановить состояние флага потока по умолчанию, вы либо (1) должны сохранить fmtflags
для потока, захватив все флаги с помощью std::ios_base::fmtflags
, либо (2) вы должны сбросить отдельное лицо флаг, установленный с помощью std::resetiosflags(...)
.
Поэтому, если я понимаю ваш вопрос и ваш запрос на выравнивание (хотя неясно, как вы хотите выровнять b[x]
), вы можете выровнять и a
, и b
с выравниванием по левому краю с помощью:
std::cout << "left justified output (both a & b)\n\n";
for (size_t i = 0; i < a.size(); i++)
std::cout << std::left << std::setw(5)
<< a[i] << " | " << b[i] << '\n';
или вы можете выровнять a
с выравниванием по левому краю и затем восстановить состояние флага по умолчанию, позволяя выводить b
с выравниванием по умолчанию (по правому краю), например,
std::cout << "\nleft justified output for a, default for b\n\n";
for (size_t i = 0; i < a.size(); i++)
std::cout << std::left << std::setw(5)
<< a[i] << " | " << std::resetiosflags(std::ios_base::left)
<< std::setw(5) << b[i] << '\n';
Сложив это в пример, вы можете сделать:
#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
int main (void) {
std::vector<std::string> a = { "frd", "asdfg", "asd", "quack" },
b = { "hehe", "hohoo", "haloo", "hack" };
std::cout << "left justified output (both a & b)\n\n";
for (size_t i = 0; i < a.size(); i++)
std::cout << std::left << std::setw(5)
<< a[i] << " | " << b[i] << '\n';
std::cout << "\nleft justified output for a, default for b\n\n";
for (size_t i = 0; i < a.size(); i++)
std::cout << std::left << std::setw(5)
<< a[i] << " | " << std::resetiosflags(std::ios_base::left)
<< std::setw(5) << b[i] << '\n';
}
Пример использования / вывода
$ ./bin/setwstring
left justified output (both a & b)
frd | hehe
asdfg | hohoo
asd | haloo
quack | hack
left justified output for a, default for b
frd | hehe
asdfg | hohoo
asd | haloo
quack | hack
Примечание: Если вы хотите внести несколько изменений в флаги в ходе операции вывода, а затем восстановить ВСЕ флаги формата в исходное состояние, вы можете использовать:
std::ios_base::fmtflags f = std::cout.flags (); // save ios_base flags
// do output, set flags as desired
std::cout.flags (f); // restore saved flags
Дайте мне знать, если это касается выравнивания, которого вы пытались достичь.