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."
进行了操作。由于它已经包含六个输出字符,因此操纵器无效。
我不明白以下表达式的逻辑,尽管它工作得很好:
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."
进行了操作。由于它已经包含六个输出字符,因此操纵器无效。