iostreams操纵者命令

时间:2016-04-20 12:20:08

标签: c++ iostream manipulators

我不理解下面的表达式中的逻辑,尽管它完美地运行:

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

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

我的逻辑是:

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

但是它会输出一些意想不到的东西:hellothere.我的期望是“有”的第一个字符“t”在输出区域的第7列之后是6列宽度之后。换句话说,我的概念是“left setw(n)”应该表示“输出区域中第一个的n列(空格)”,就像一些带有编号列的数据表格一样,便于查找数据。

你能解释一下吗?

2 个答案:

答案 0 :(得分:5)

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

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

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

在第二个代码段中,仅操作项"there."。由于它已经由六个输出字符组成,因此操纵器无效。

答案 1 :(得分:1)

操纵者改变ostream的状态。所以他们应该在之前应用要求输出内容。

在你的情况下,你问:

  • 格式化下一个输出
  • 格式化下一个输出,大小为6个字符
  • 输出&#39;你好&#39;

因此,流输出单词&#34; hello&#34;然后是1个空格,达到6的大小,正如操纵者序列所要求的那样。

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

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

  

if(os.flags()&amp; ios_base :: adjustfield)== ios_base :: left,将os.width() - str.size()副本放在字符序列后面的os.fill()字符中/ p>

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)