面向对象程序设计-文档作业-cout

面向对象程序设计-文档作业-cout

本文字数:1456  阅读时长:3分钟

访问量 0

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来代替手动置位,是更方便的方法。