iostreams 操纵器顺序

iostreams manipulator order

我不明白以下表达式的逻辑,尽管它工作得很好:

cout << left << setw(6) << "hello" << "there." ; 

前面的代码正确输出了我所期望的:hello there.

我的逻辑是:

cout << "hello" << left << setw(6) << "there."; 

但它输出了一些意想不到的东西:hellothere. 我的期望是 "there" 的第一个字符 "t" 位于输出区域的第 7 列,即 6 列宽度之后。换句话说,我的概念是 "left setw(n)" 应该意味着 "n columns (spaces) from first one on output area",就像一些带有编号列的数据表单,以便于查找数据。

你能解释一下吗?

操纵器改变 ostream 的状态。所以他们应该在流被要求输出一些东西之前应用

在你的情况下你会问:

  • 格式化左边的下一个输出
  • 将下一个输出格式化为 6 个字符的大小
  • 输出'hello'

因此流输出单词 "hello" 后跟 1 space 以达到大小 6,如操纵器序列所要求的那样。

您可以在那里找到参考资料:

我引用最重要的句子 std::left + operator << :

if (os.flags() & ios_base::adjustfield) == ios_base::left, places os.width()-str.size() copies of the os.fill() character after the character sequence

std::setw

The width property of the stream will be reset to zero (meaning "unspecified") if any of the following functions are called:

Input
   operator>>(basic_istream&, basic_string&)
   operator>>(basic_ostream&, char*)

Output
  Overloads 1-7 of basic_ostream::operator<<() (at Stage 3 of num_put::put())
  operator<<(basic_ostream&, char) and operator<<(basic_ostream&, char*)
  operator<<(basic_ostream&, basic_string&)
  std::put_money (inside money_put::put())
  std::quoted (when used with an output stream)

setw iostreams 操纵器适用于输出的 next 项目,并且仅适用于该项目。因此,在第一个片段中,"hello" 被修改为 "left, field width 6",从而产生以下输出:

|h|e|l|l|o| |

填充字符默认为space(' '),这是在没有更多输入数据且尚未达到字段宽度时的输出。

在第二个代码段中,仅对项目 "there." 进行了操作。由于它已经包含六个输出字符,因此操纵器无效。