格式化输出流,ios::left和ios::right

9

我有这段代码:

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',但没有任何区别?
5个回答

19

除非你感到自虐,否则请使用:

// 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';

8

在设置新值之前,您必须清除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';
}

8
使用setf并带上掩码(无需使用resetiosflags)来进行操作。
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

1

你的代码需要向输出流发送std::resetiosflags(std::ios::right)以撤销之前的std::setiosflags(std::ios::right)


1

看起来如果同时设置了leftright标志,那么先设置的标志将具有优先权。如果我在设置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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接