What is the default format, when I'm writting a double to a stringstream
?
double v = 3.0;
std::stringstream ss;
ss << v;
Where can I find a list of the default format setup for a stringstream
? Is the default format the same for all derived classes of std::istream
(within the stdlib)?
答案 0 :(得分:5)
默认设置是由std::basic_ios::init
设置的,并且对于所有从ios_base
派生的流来说都是相同的。默认值为:
rdbuf() sb
tie() 0
rdstate() goodbit if sb is not a null pointer, otherwise badbit.
exceptions() goodbit
flags() skipws | dec
width() 0
precision() 6
fill() widen(’ ’)
getloc() a copy of the value returned by locale()
iarray a null pointer
parray a null pointer
因此默认精度为6
答案 1 :(得分:2)
在哪里可以找到字符串流的默认格式设置列表?
所有标准库行为的权威来源是标准文档。在这种情况下,[basic.ios.members]部分中标记为basic_ios::init() effects
的表。
+--------------+--------------------------------------------------------+
| Element | Value |
+--------------+--------------------------------------------------------+
| rdbuf() | sb |
| tie() | 0 |
| rdstate() | goodbit if sb is not a null pointer, otherwise badbit. |
| exceptions() | goodbit |
| flags() | skipws | dec |
| width() | 0 |
| precision() | 6 |
| fill() | widen(’ ’) |
| getloc() | a copy of the value returned by locale() |
| iarray | a null pointer |
| parray | a null pointer |
+--------------+--------------------------------------------------------+
格式化浮点数取决于floatfield
标志,该标志在默认flags()
中未设置。该行为在[facet.num.put.virtuals]部分的表Floating-point conversions
中定义。
+----------------------------------------------------------------------+-----------------+
| State | stdioequivalent |
+----------------------------------------------------------------------+-----------------+
| floatfield == ios_base::fixed | %f |
| floatfield == ios_base::scientific && !uppercase | %e |
| floatfield == ios_base::scientific | %E |
| floatfield == (ios_base::fixed | ios_base::scientific) && !uppercase | %a |
| floatfield == (ios_base::fixed | ios_base::scientific) | %A |
| !uppercase | %g |
| otherwise | %G |
+----------------------------------------------------------------------+-----------------+
因此,初始状态下的格式化应与stdio格式标志%G
相匹配。在C标准的[格式化的输入/输出功能]部分中指定了stdio格式标志:
f,F
表示浮点数的 double 参数将转换为[-] ddd.ddd格式的十进制表示法,其中小数点字符后的位数等于精度规范。如果缺少精度,则取值为6;否则,取值为0。如果精度为零,并且未指定#标志,则不显示小数点字符。如果出现小数点字符,则在其前面至少出现一位数字。该值将四舍五入为适当的位数。
e,E
表示浮点数的 double 参数将以[-] d.ddde±dd格式转换,其中在该参数之前有一个数字(如果参数为非零,则为非零)。小数点字符及其后的位数等于精度;如果精度丢失,则取为6;如果精度为零,并且未指定#标志,则不显示小数点字符。该值将四舍五入为适当的位数。 E 转换说明符使用 E 而不是引入指数的 e 产生一个数字。指数始终至少包含两位数,并且仅包含表示指数所需的更多位数。如果值为零,则指数为零。
表示无穷大的 double 参数转换为以下一种样式: [-] inf 或 [-] infinity -实现定义的。表示NaN的双引数会转换为 [-] nan *或** [-nan] (n-char-sequence)样式之一-哪种样式以及任何n-字符序列是实现定义的。 F转换说明符产生 INF , INFINITY 或 NAN 而不是 inf ,无穷大 >或 nan 。
g,G
表示浮点数的 double 参数以 f 或 e 风格(或以 F 风格)转换(如果是 G 转换说明符,则为strong>或 E ),具体取决于转换后的值和精度。假设
P
等于精度(如果非零),6(如果省略精度)或1(如果精度为零)。然后,如果样式为 E 的转换的指数为X
:
- 如果
P > X ≥ -4
,则转换采用样式 f (或 F )和精度P - (X + 1)
。- 否则,转换的样式为 e (或 E ),精度为
P - 1
。
std :: istream的所有派生类(在stdlib中)的默认格式是否相同?
是的,默认设置相同。