cout.put()
- 方便理解的声明形式:
cpp
std::ostream& put(char c);- 含义:输出一个字符。
- put会返回流对象的引用,cout.put(xx)会返回cout。这个特性使得它可以链式调用,连续输出。
- 此类输出无视宽度(width)和填充(fill)
cout.write()
- 方便理解的声明形式:
cpp
std::ostream& write(const char* s, std::streamsize n);- 含义:从给定的字符指针s起,输出n个字符。
- write会返回流对象的引用,cout.write(xx)会返回cout。这个特性使得它可以链式调用,连续输出。
- 此类输出无视宽度(width)和填充(fill)
- write完全不管什么尾零,什么越界,他就读n个字符的内存,字符是什么就输出什么。所以不严谨的使用可能会造成各种UB。
内容输出位置控制
cout.width(n)
- 同
cout << setw(n) - 输出宽度默认为0.输出内容会以输出宽度作为最小宽度。若实际内容小于这给最小宽度,会进行填充以补全宽度。
- 单次生效。具体来说宽度的设置会被特定的输出操作重置为0.
cout.fill(c)
- 同
cout << setfill(c) - 决定上面填充时使用的字符,默认为空格。
- 长期生效。具体来说是直到下一次手动更改之前不会变化。
cout.setf(ios::left/ios::right)
- 同
cout << setiosflags(ios::left/ios::right),完全一致。 - 设定标志位,决定上面填充时,让实际内容在这一段宽度中偏向哪一侧。默认情况下没有标志位的时候,默认在实际内容的前面补填充字符,使得它表现为右对齐。但是ios::right是明确指定了右对齐。没有标志位和仅有ios::right标志位实际上用起来没有区别。
- 长期生效。具体来说是直到下一次手动更改之前不会变化。所以在使用这两个标志位的时候,需要注意清除旧标志位。
- ios::left和ios::right同时存在时内容又会靠右。这个状态在机制上完全合法,也不会报错,但是这是一种不恰当的使用方法,从使用角度没有任何意义,需要避免。
- (课内无此内容!)为了解决残留状态位的问题,你也可以使用
cout.setf(ios::left/ios::right, ios::adjustfield)或者cout << left/right来左右对齐,两种完全等价,比上面这种方式看着要舒服多,对称的多。原理是ios::adjustfield包含left、right、internal的整组掩码,放在第二个参数会提前清理一遍旧有的标志位。
浮点数输出格式控制
cout.precision(n)
- 同
cout << setprecision(n),完全一致。 - 这个大体上是表示浮点数输出时的精度,默认为6.但是意义随着下面2个标志位的设定而不同,往下。
标志位ios::fixed和ios::scientific,
- 同样既可以用
setf()和unsetf()、setiosflags()和resetiosflags()`。完全等价。 - 同样长期存在。标志位都是这样的。
| 标志位状态 | 此时浮点数输出的情况 | 此时precision的意义 |
|---|---|---|
| 都没有 | 默认状态。自动选择小数形式和指数形式。这个选择的规则是(课内没有!):把数值按科学计数法、保留 p 个有效数字舍入后,得到指数 X,- -4 ≤ X < p则使用普通小数形式。 - X < -4 或 X ≥ p则使用指数形式。如果有效位数保留完了末尾还有0,会把这个0进一步省掉(比如1.25不会变成1.25000)。 | 有效位数。 |
ios::fixed | 仅小数模式。会按照precision补0. | 小数点后保留位数。 |
ios::scientific | 仅指数模式。 | 指数前面乘的那个小数的小数点后保留位数。 |
| 都有 | 十六进制小数模式,被神剑称为“错误” | 不限制该模式的小数位数 |
- (课内无此内容)就像上面的left和right,可以用
cout << fixed和cout<< scientific来代替手动置位,是更方便的方法。
- 本文链接: https://alsbb.top/posts/oop/oop-doc-1/
- 版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。
