std::num_put::put, std::num_put::do_put

来自cppreference.com
< cpp‎ | locale‎ | num put

定义于头文件 <locale>
public:

iter_type put( iter_type out, std::ios_base& str, char_type fill, bool v) const;
iter_type put( iter_type out, std::ios_base& str, char_type fill, long v) const;
iter_type put( iter_type out, std::ios_base& str, char_type fill, long long v) const;
iter_type put( iter_type out, std::ios_base& str, char_type fill, unsigned long v) const;
iter_type put( iter_type out, std::ios_base& str, char_type fill, unsigned long long v) const;
iter_type put( iter_type out, std::ios_base& str, char_type fill, double v) const;
iter_type put( iter_type out, std::ios_base& str, char_type fill, long double v) const;

iter_type put( iter_type out, std::ios_base& str, char_type fill, const void* v) const;
(1)
protected:

iter_type do_put( iter_type out, std::ios_base& str, char_type fill, bool v) const;
iter_type do_put( iter_type out, std::ios_base& str, char_type fill, long v) const;
iter_type do_put( iter_type out, std::ios_base& str, char_type fill, long long v) const;
iter_type do_put( iter_type out, std::ios_base& str, char_type fill, unsigned long) const;
iter_type do_put( iter_type out, std::ios_base& str, char_type fill, unsigned long long) const;
iter_type do_put( iter_type out, std::ios_base& str, char_type fill, double v) const;
iter_type do_put( iter_type out, std::ios_base& str, char_type fill, long double v) const;

iter_type do_put( iter_type out, std::ios_base& str, char_type fill, const void* v) const;
(2)
1)
公共成员函数,调用受保护的最派生类的虚成员函数do_put的.
原文:
public member function, calls the protected virtual member function do_put of the most derived class.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
2)
将字符写入到输出序列out代表的价值v,格式所要求的格式标志str.flags()及充满流中的std::numpunctstd::ctypestr方面的语言环境。这个函数被调用的所有格式的输出流的运营商,如std::cout << n;.
原文:
writes characters to the output sequence out which represent the value of v, formatted as requested by the formatting flags str.flags() and the std::numpunct and std::ctype facets of the locale imbued in the stream str. This function is called by all formatted output stream operators, such as std::cout << n;.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
转换发生在四个阶段
原文:
Conversion occurs in four stages
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

目录

[编辑] 第1阶段:转换符的选择

  • I / O格式的标志,如果获得
    原文:
    I/O format flags are obtained, as if by
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
fmtflags basefield = (str.flags() & std::ios_base::basefield);
fmtflags uppercase = (str.flags() & std::ios_base::uppercase);
fmtflags floatfield = (str.flags() & std::ios_base::floatfield);
fmtflags showpos = (str.flags() & std::ios_base::showpos);
fmtflags showbase = (str.flags() & std::ios_base::showbase);
  • 如果类型vbool
    原文:
    If the type of v is bool
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
  • *如果boolalpha == 0,然后将其转换v输入int和执行整数输出.
    原文:
    * If boolalpha == 0, then converts v to type int and performs integer output.
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
  • *如果boolalpha != 0获得std::use_facet<std::numpunct<charT>>(str.getloc()).truename()如果v == truestd::use_facet<std::numpunct<charT>>(str.getloc()).falsename()如果v == false,并输出该字符串中的每个连续字符cout*out++ = c。没有进一步的处理工作是在这种情况下,该函数返回out.
    原文:
    * If boolalpha != 0 obtains std::use_facet<std::numpunct<charT>>(str.getloc()).truename() if v == true or std::use_facet<std::numpunct<charT>>(str.getloc()).falsename() if v == false, and outputs each successive character c of that string to out with *out++ = c. No further processing is done in this case, the function returns out.
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
  • 如果类型的v是一个整数类型,第一个适用的选择:选择以下五个
    原文:
    If the type of v is an integer type, the the first applicable choice of the following five is selected:
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
如果basefield == oct,将使用转换符%o
原文:
If basefield == oct, will use conversion specifier %o
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
如果basefield == hex && !uppercase,将使用转换符%x
原文:
If basefield == hex && !uppercase, will use conversion specifier %x
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
如果basefield == hex,将使用转换符%X
原文:
If basefield == hex, will use conversion specifier %X
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
如果v签署,将使用转换符%d
原文:
If the type of v is signed, will use conversion specifier %d
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
如果是无符号的类型v,将使用转换符%u
原文:
If the type of v is unsigned, will use conversion specifier %u
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
  • 对于整数类型,长度修改器添加到转换规范,如果必要的:llongunsigned longlllong longunsigned long long.
    原文:
    For integer types, length modifier is added to the conversion specification if necessary: l for long and unsigned long, ll for long long and unsigned long long.
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
  • v的浮点类型的类型,第一个适用的选择:选择以下五个
    原文:
    If the type of v is a floating-point type, the the first applicable choice of the following five is selected:
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
如果floatfield == std::ios_base::fixed,将使用转换符%f
原文:
If floatfield == std::ios_base::fixed, will use conversion specifier %f
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
如果floatfield == std::ios_base::scientific && !uppercase,将使用转换符%e
原文:
If floatfield == std::ios_base::scientific && !uppercase, will use conversion specifier %e
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
如果floatfield == std::ios_base::scientific,将使用转换符%E
原文:
If floatfield == std::ios_base::scientific, will use conversion specifier %E
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
如果floatfield == (std::ios_base::fixed | std::ios_base::scientific) && !uppercase,将使用转换符%a(C++11 起)
原文:
If floatfield == (std::ios_base::fixed | std::ios_base::scientific) && !uppercase, will use conversion specifier %a (C++11 起)
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
如果floatfield == std::ios_base::fixed | std::ios_base::scientific,将使用转换符%A(C++11 起)
原文:
If floatfield == std::ios_base::fixed | std::ios_base::scientific, will use conversion specifier %A (C++11 起)
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
如果!uppercase,将使用转换符%g
原文:
If !uppercase, will use conversion specifier %g
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
否则,将使用转换符%G
原文:
otherwise, will use conversion specifier %G
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
  • *如果类型vlong double,长度修饰符L被添加到转换符.
    原文:
    * If the type of v is long double, the length modifier L is added to the conversion specifier.
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
  • *此外,如果floatfield != (ios_base::fixed | ios_base::scientific),再精密的改性剂添加,设置str.precision()
    原文:
    * Additionally, if floatfield != (ios_base::fixed | ios_base::scientific), then precision modifier is added, set to str.precision()
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
  • 对于整数和浮点类型,如果showbase,改性剂#前缀。如果showpos设置,在修改+前缀.
    原文:
    For both integer and floating-point types, if showbase is set, the modifier # is prepended. If showpos is set, the modifier + is prepended.
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
  • 如果vvoid*,将使用转换符%p
    原文:
    If the type of v is void*, will use conversion specifier %p
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
  • 如果一个窄字符串被创建为调用std::printf(spec, v)中的“C”语言环境,spec是所选择的转换说明.
    原文:
    A narrow character string is created as if by a call to std::printf(spec, v) in the "C" locale, where spec is the chosen conversion specifier.
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 第2阶段:区域设置特定的转换

  • 在阶段1中,以及其他比小数点c,获得的每个字符都'.'转换CharT通过调用std::use_facet<std::ctype<CharT>>(str.getloc()).widen(c).
    原文:
    Every character c obtained in Stage 1, other than the decimal point '.', is converted to CharT by calling std::use_facet<std::ctype<CharT>>(str.getloc()).widen(c).
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
  • 算术类型,千位分隔符的字符,得到了从std::use_facet<std::numpunct<CharT>>(str.getloc()).thousands_sep(),插入的顺序,根据所提供的分组规则std::use_facet<std::numpunct<CharT>>(str.getloc()).grouping()
    原文:
    For arithmetic types, the thousands separator character, obtained from std::use_facet<std::numpunct<CharT>>(str.getloc()).thousands_sep(), is inserted into the sequence according to the grouping rules provided by std::use_facet<std::numpunct<CharT>>(str.getloc()).grouping()
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
  • 小数点字符('.')所取代std::use_facet<std::numpunct<CharT>>(str.getloc()).decimal_point()
    原文:
    Decimal point characters ('.') are replaced by std::use_facet<std::numpunct<CharT>>(str.getloc()).decimal_point()
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 第3阶段:填充

  • 得到调整标志犹如std::fmtflags adjustfield = (flags & (std::ios_base::adjustfield))和检查,以识别填充的位置,如下所示
    原文:
    The adjustment flag is obtained as if by std::fmtflags adjustfield = (flags & (std::ios_base::adjustfield)) and examined to identify padding location, as follows
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。
如果adjustfield == std::ios_base::left,将垫后
原文:
If adjustfield == std::ios_base::left, will pad after
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
如果adjustfield == std::ios_base::right,会前垫
原文:
If adjustfield == std::ios_base::right, will pad before
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
adjustfield == std::ios_base::internal的代表性和符号字符时,将垫后签收
原文:
If adjustfield == std::ios_base::internal and a sign character occurs in the representation, will pad after the sign
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
如果以0x或0X开始adjustfield == std::ios_base::internal第1阶段表示,将垫在x或X
原文:
If adjustfield == std::ios_base::internal and Stage 1 representation began with 0x or 0X, will pad after the x or X
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
否则,会前垫
原文:
otherwise, will pad before
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
  • 如果str.width()是非零的(例如std::setw,只是使用)和的数目为CharT的第2阶段后比str.width()少,然后fill字符的副本被插入在表示通过填充以使该序列的长度来str.width()的位置。
    原文:
    If str.width() is non-zero (e.g. std::setw was just used) and the number of CharT's after Stage 2 is less than str.width(), then copies of the fill character are inserted at the position indicated by padding to bring the length of the sequence to str.width().
    文本通过谷歌翻译机器翻译。
    你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 第4阶段:输出

c从图表的第3阶段的顺序是每一个连续的字符输出,如果通过*out++ = c.
原文:
Every successive character c from the sequence of CharT's from Stage 3 is output as if by *out++ = c.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 参数

out -
迭代器指向的第一个字符将被覆盖
原文:
iterator pointing to the first character to be overwritten
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
str -
流式传输给信息检索的格式
原文:
stream to retrieve the formatting information from
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
fill -
使用填充字符的结果时,需要填充的字段宽度
原文:
padding character used when the results needs to be padded to the field width
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
v -
值转换为字符串,并输出
原文:
value to convert to string and output
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 返回值

out

[编辑] 注释

前导零的转换规范#o(导致的组合std::showbasestd::oct例如)作为填充字符,不计.
原文:
The leading zero generated by the conversion specification #o (resulting from the combination of std::showbase and std::oct for example) is not counted as a padding character.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 示例

输出一个数字,使用全局locale
原文:
Output a number using global locale
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

#include <iostream>
#include <locale>
 
int main()
{
    auto &facet = std::use_facet<std::num_put<char>>(std::locale());
    facet.put(std::cout, std::cout, '0', 2.71);
    std::cout << '\n';
}

输出:

2,71

[编辑] 另请参阅

插入有格式数据
(std::basic_ostream 的公开成员函数) [编辑]