我有这个代码:
cout << std::setiosflags(std::ios::right);
cout << setw(3) << 1 << setw(3) << 2 << 'n'; // Output two values
cout << std::setiosflags(std::ios::left);
cout << setw(3) << 1 << setw(3) << 2 << 'n'; // Output two values
但产出并没有达到我的预期。而不是:
1 2
1 2
结果是:
1 2
1 2
问题出在哪里?我设置了"std::ios::left",但没有区别?
除非你感到受虐,否则只需使用:
// right justify by default.
cout << setw(3) << 1 << setw(3) << 2 << 'n';
// left justify
cout << std::left << setw(3) << 1 << setw(3) << 2 << 'n';
// right justify again.
cout << std::right << setw(3) << 1 << setw(3) << 2 << 'n';
在设置新值之前,必须清除adjustfield中的前一个值。
试试这个:
#include <iostream>
#include <iomanip>
int main () {
std::cout << std::resetiosflags(std::ios::adjustfield);
std::cout << std::setiosflags(std::ios::right);
std::cout << std::setw(3) << 1 << std::setw(3) << 2 << 'n';
std::cout << std::resetiosflags(std::ios::adjustfield);
std::cout << std::setiosflags(std::ios::left);
std::cout << std::setw(3) << 1 << std::setw(3) << 2 << 'n';
}
使用带掩码的setf(无需重置标志)
using namespace std;
cout.setf(ios::right, ios::adjustfield);
cout << setw(3) << 1 << setw(3) << 2 << 'n'; // Output two values
cout.setf(ios::left, ios::adjustfield);
cout << setw(3) << 1 << setw(3) << 2 << 'n'; // Output two values
您的代码希望将std::resetiosflags(std::ios::right)
发送到输出流以撤消前面的std::setiosflags(std::ios::right)
。
如果同时设置了left
和right
标志,则首先设置的标志优先。如果我在设置left
之前明确重置right
标志,我会得到您期望的输出:
cout << std::setiosflags(std::ios::right);
cout << setw(3) << 1 << setw(3) << 2 << 'n'; // Output two values
cout << resetiosflags(std::ios::right);
cout << std::setiosflags(std::ios::left);
cout << setw(3) << 1 << setw(3) << 2 << 'n'; // Output two values