操纵符是令代码能以 operator<< 或 operator>> 控制输入/输出流的帮助函数。
std::ios_base& dec( std::ios_base& str ); std::ios_base& hex( std::ios_base& str ); std::ios_base& oct( std::ios_base& str );
修改整数 I/O 的默认数值底。
1) 如同以调用 str.setf(std::ios_base::dec, std::ios_base::basefield) 设置流
str
的basefield
为dec
2) 如同以调用 str.setf(std::ios_base::hex, std::ios_base::basefield) 设置流
str
的basefield
为hex
3) 如同以调用 str.setf(std::ios_base::oct, std::ios_base::basefield) 设置流
str
的basefield
为oct
setbase( int base );
设置流的数值底。用于表达式 out << setbase(base) 或 in >> setbase(base) 时,取决于
base
的值,更改流out
或in
的basefield
标志:
- 值 16 设置
basefield
为 std::ios_base::hex- 值 8 设置 std::ios_base::oct
- 值 10 设置 std::ios_base::dec 。
异于 8 、 10 或 16 的
base
值重置basefield
为零,这对应十进制输出和依赖前缀的输入。
#include
#include
int main()
{
std::cout << "The number 42 in octal: " << std::oct << 42 << '\n'
<< "The number 42 in decimal: " << std::dec << 42 << '\n'
<< "The number 42 in hex: " << std::hex << 42 << '\n';
int n;
std::istringstream("2A") >> std::hex >> n;
std::cout << std::dec << "Parsing \"2A\" as hex gives " << n << '\n';
// 输出基底是持久的,直至更改
std::cout << std::hex << "42 as hex gives " << 42
<< " and 21 as hex gives " << 21 << '\n';
}
#include
#include
#include
int main()
{
std::cout << "Parsing string \"10 0x10 010\"\n";
int n1, n2, n3;
std::istringstream s("10 0x10 010");
s >> std::setbase(16) >> n1 >> n2 >> n3;
std::cout << "hexadecimal parse: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
s.clear();
s.seekg(0);
s >> std::setbase(0) >> n1 >> n2 >> n3;
std::cout << "prefix-dependent parse: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
std::cout << "hex output: " << std::setbase(16)
<< std::showbase << n1 << ' ' << n2 << ' ' << n3 << '\n';
}
/*unspecified*/ setprecision( int n );
更改浮点数精度
#include
#include
#include
#include
int main()
{
const long double pi = std::acos(-1.L);
std::cout << "default precision (6): " << pi << '\n'
<< "std::setprecision(10): " << std::setprecision(10) << pi << '\n'
<< "max precision: "
<< std::setprecision(std::numeric_limits::digits10 + 1)
<< pi << '\n';
}
定义于头文件
std::ios_base& fixed( std::ios_base& str ); std::ios_base& scientific( std::ios_base& str ); std::ios_base& hexfloat( std::ios_base& str ); std::ios_base& defaultfloat( std::ios_base& str ); 修改浮点输入/输出的默认格式化。
1) 如同以调用 str.setf(std::ios_base::fixed, std::ios_base::floatfield) ,设置流
str
的floatfield
为fixed
2) 如同以调用 str.setf(std::ios_base::scientific, std::ios_base::floatfield) ,设置流
str
的floatfield
为scientific
3) 如同以调用 str.setf(std::ios_base::fixed | std::ios_base::scientific, std::ios_base::floatfield) ,设置流
str
的floatfield
同为fixed
和scientific
。这启用十六进制浮点格式化。4) 如同以调用 str.unsetf(std::ios_base::floatfield) ,设置流
str
的floatfield
为零,这异于 fixed 和 scientific 。
#include
#include
int main()
{
std::cout << "The number 0.01 in fixed: " << std::fixed << 0.01 << '\n'
<< "The number 0.01 in scientific: " << std::scientific << 0.01 << '\n'
<< "The number 0.01 in hexfloat: " << std::hexfloat << 0.01 << '\n'
<< "The number 0.01 in default: " << std::defaultfloat << 0.01 << '\n';
double f;
std::istringstream("0x1P-1022") >> std::hexfloat >> f;
std::cout << "Parsing 0x1P-1022 as hex gives " << f << '\n';
}
std::ios_base& boolalpha( std::ios_base& str ); std::ios_base& noboolalpha( std::ios_base& str );
在布尔值的文本和数值表示间切换
1) 启用流
str
中的boolalpha
标志,如同通过调用 str.setf(std::ios_base::boolalpha) 。2) 禁用流
str
中的boolalpha
标志,如同通过调用 str.unsetf(std::ios_base::boolalpha) 。
std::boolalpha
是 I/O 操纵符,故可用如 out << std::boolalpha 的表达式对任何 std::basic_ostream 类型的out
,或用如 in >> std::boolalpha 的表达式对任何 std::basic_istream 类型的in
调用。
#include
#include
#include
int main()
{
// boolalpha 输出
std::cout << std::boolalpha
<< "boolalpha true: " << true << '\n'
<< "boolalpha false: " << false << '\n';
std::cout << std::noboolalpha
<< "noboolalpha true: " << true << '\n'
<< "noboolalpha false: " << false << '\n';
// boolalpha 分析
bool b1, b2;
std::istringstream is("true false");
is >> std::boolalpha >> b1 >> b2;
std::cout << '\"' << is.str() << "\" parsed as " << b1 << ' ' << b2 << '\n';
}
std::ios_base& showbase( std::ios_base& str ); std::ios_base& noshowbase( std::ios_base& str );
控制是否使用前缀指示数值基数
1) 如同以调用 str.setf(std::ios_base::showbase) 启用流
str
中的showbase
标志2) 如同以调用 str.unsetf(std::ios_base::showbase) 禁用流
str
中的showbase
标志这是 I/O 操纵符,可用如 out << std::showbase 的表达式对任何 std::basic_ostream 类型
out
的,或用如 in >> std::showbase 的表达式对任何 std::basic_istream 类型的in
调用。
showbase
标志影响整数输出(见 std::num_put::put )、货币输入(见 std::money_get::get )和货币输出(见 std::money_put::put )的行为。
#include
#include
#include
#include
int main()
{
std::cout << std::hex
<< "showbase: " << std::showbase << 42 << '\n'
<< "noshowbase: " << std::noshowbase << 42 << '\n';
}
std::ios_base& showpoint( std::ios_base& str ); std::ios_base& noshowpoint( std::ios_base& str );
启用或禁用浮点输出中的无条件小数点包含。在输入上无效果。
1) 如同用调用 str.setf(std::ios_base::showpoint) 启用流
str
中的showpoint
标志2) 如同用调用 str.unsetf(std::ios_base::showpoint) 禁用流
str
中的showpoint
标志
#include
int main()
{
std::cout << "1.0 with showpoint: " << std::showpoint << 1.0 << '\n'
<< "1.0 with noshowpoint: " << std::noshowpoint << 1.0 << '\n';
}
std::ios_base& showpos( std::ios_base& str ); std::ios_base& noshowpos( std::ios_base& str );
启用或禁用非负数输出中的正号 '+' 的显示。在输入上无效果。
1) 如同用调用 str.setf(std::ios_base::showpos) 启用流 str 中的 showpos 标志
2) 如同用调用 str.unsetf(std::ios_base::showpos) 禁用流 str 中的 showpos 标志
#include
int main()
{
std::cout << "showpos: " << std::showpos << 42 << ' ' << 3.14 << ' ' << 0 << '\n'
<< "noshowpos: " << std::noshowpos << 42 << ' ' << 3.14 << ' ' << 0 << '\n';
}
std::ios_base& skipws( std::ios_base& str ); std::ios_base& noskipws( std::ios_base& str );
启用或禁用有格式输入函数所做的跳过前导空白符(默认启用)。在输出上无效果。
1) 如同用调用 str.setf(std::ios_base::skipws) 启用流 str 中的 skipws 标志
2) 如同用调用 str.unsetf(std::ios_base::skipws) 禁用流 str 中的 skipws 标志template< class CharT, class Traits > std::basic_istream
& ws( std::basic_istream & is ); 从输入流舍弃前导空白符。
#include
#include
int main()
{
char c1, c2, c3;
std::istringstream("a b c") >> c1 >> c2 >> c3;
std::cout << "Default behavior: c1 = " << c1 << " c2 = " << c2 << " c3 = " << c3 << '\n';
std::istringstream("a b c") >> std::noskipws >> c1 >> c2 >> c3;
std::cout << "noskipws behavior: c1 = " << c1 << " c2 = " << c2 << " c3 = " << c3 << '\n';
}
#include
#include
#include
#include
int main()
{
std::istringstream s(" this is a test");
std::string line;
std::getline(s >> std::ws, line);
std::cout << "ws + getline returns: \"" << line << "\"\n";
}
std::ios_base& uppercase( std::ios_base& str ); std::ios_base& nouppercase( std::ios_base& str );
启用浮点和十六进制整数输出中大写字符的使用。在输入时无效果。
1) 如同用调用 str.setf(std::ios_base::uppercase) 启用流
str
中的uppercase
标志2) 如同用调用 str.unsetf(std::ios_base::uppercase) 禁用流
str
中的uppercase
标志
#include
int main()
{
std::cout << std::hex << std::showbase
<< "0x2a with uppercase: " << std::uppercase << 0x2a << '\n'
<< "0x2a with nouppercase: " << std::nouppercase << 0x2a << '\n'
<< "1e-10 with uppercase: " << std::uppercase << 1e-10 << '\n'
<< "1e-10 with nouppercase: " << std::nouppercase << 1e-10 << '\n';
}
template< class CharT > /*unspecified*/ setfill( CharT c );
用于表达式 out << setfill(c) 时,它设置流
out
的填充字符为c
。std::ios_base& left( std::ios_base& str ); std::ios_base& right( std::ios_base& str ); std::ios_base& internal( std::ios_base& str );
修改填充字符的默认定位。
left
与right
应用到任何输出,而internal
应用到整数、浮点和货币输出。在输入时无效果。1) 如同用调用 str.setf(std::ios_base::left, std::ios_base::adjustfield) ,设置流
str
的adjustfield
为left
2) 如同用调用 str.setf(std::ios_base::right, std::ios_base::adjustfield) ,设置流
str
的adjustfield
为right
3) 如同用调用 str.setf(std::ios_base::internal, std::ios_base::adjustfield) ,设置流
str
的adjustfield
为internal
#include
#include
int main()
{
std::cout << "default fill: " << std::setw(10) << 42 << '\n'
<< "setfill('*'): " << std::setfill('*')
<< std::setw(10) << 42 << '\n';
}
#include
#include
#include
int main()
{
std::cout.imbue(std::locale("en_US.utf8"));
std::cout << "Left fill:\n" << std::left << std::setfill('*')
<< std::setw(12) << -1.23 << '\n'
<< std::setw(12) << std::hex << std::showbase << 42 << '\n'
<< std::setw(12) << std::put_money(123, true) << "\n\n";
std::cout << "Internal fill:\n" << std::internal
<< std::setw(12) << -1.23 << '\n'
<< std::setw(12) << 42 << '\n'
<< std::setw(12) << std::put_money(123, true) << "\n\n";
std::cout << "Right fill:\n" << std::right
<< std::setw(12) << -1.23 << '\n'
<< std::setw(12) << 42 << '\n'
<< std::setw(12) << std::put_money(123, true) << '\n';
}
std::ios_base& unitbuf( std::ios_base& str ); std::ios_base& nounitbuf( std::ios_base& str );
启用或禁用任何输出操作后的自动fflush。在输入时无效果。
1) 如同用调用 str.setf(std::ios_base::unitbuf) 启用流
str
中的unitbuf
标志2) 如同用调用 str.unsetf(std::ios_base::unitbuf) 禁用流
str
中的unitbuf
标志
template< class CharT, class Traits > std::basic_ostream
& ends( std::basic_ostream & os ); 输出 '\0'
template< class CharT, class Traits > std::basic_ostream
& endl( std::basic_ostream & os ); 输出 '\n' 并冲洗输出流。如同调用 os.put(os.widen('\n')) 后随 os.flush() 。
#include
#include
int main()
{
std::ostrstream oss;
oss << "Sample text: " << 42 << std::ends;
std::printf("%s\n", oss.str());
oss.freeze(false); // 启用内存解分配
}
#include
#include
template
void log_progress(Diff d)
{
std::cout << std::chrono::duration_cast(d).count()
<< " ms passed" << std::endl;
}
int main()
{
std::cout.sync_with_stdio(false); // 一些平台上 stdout 在写 \n 时冲入
volatile int sink = 0;
auto t1 = std::chrono::high_resolution_clock::now();
for (int j=0; j<5; ++j)
{
for (int n=0; n<10000; ++n)
for (int m=0; m<20000; ++m)
sink += m*n; // 做一些工作
auto now = std::chrono::high_resolution_clock::now();
log_progress(now - t1);
}
}
resetiosflags( std::ios_base::fmtflags mask );
用于表达式 out << resetiosflags(mask) 或 in >> resetiosflags(mask) 中时,清除流
out
或in
中mask
所指定的所有格式标志。setiosflags( std::ios_base::fmtflags mask );
用于表达式 out << setiosflags(mask) 或 in >> setiosflags(mask) 时,设置流
out
或in
的所有格式标志为mask
所指定者
#include
#include
#include
int main()
{
std::istringstream in("10 010 10 010 10 010");
int n1, n2;
in >> std::oct >> n1 >> n2;
std::cout << "Parsing \"10 010\" with std::oct gives: " << n1 << ' ' << n2 << '\n';
in >> std::dec >> n1 >> n2;
std::cout << "Parsing \"10 010\" with std::dec gives: " << n1 << ' ' << n2 << '\n';
in >> std::resetiosflags(std::ios_base::basefield) >> n1 >> n2;
std::cout << "Parsing \"10 010\" with autodetect gives: " << n1 << ' ' << n2 << '\n';
}
#include
#include
int main()
{
std::cout << std::resetiosflags(std::ios_base::dec)
<< std::setiosflags( std::ios_base::hex
| std::ios_base::uppercase
| std::ios_base::showbase) << 42 << '\n';
}
/*unspecified*/ setw( int n );
更改下个输入/输出域的宽度
#include
#include
#include
int main()
{
std::cout << "no setw:" << 42 << '\n'
<< "setw(6):" << std::setw(6) << 42 << '\n'
<< "setw(6), several elements: " << 89 << std::setw(6) << 12 << 34 << '\n';
std::istringstream is("hello, world");
char arr[10];
is >> std::setw(6) >> arr;
std::cout << "Input from \"" << is.str() << "\" with setw(6) gave \""
<< arr << "\"\n";
}
template< class MoneyT > /*unspecified*/ get_money( MoneyT& mon, bool intl = false ); // 解析货币值 template< class MoneyT > /*unspecified*/ put_money( const MoneyT& mon, bool intl = false ); // 格式化并输出货币值
#include
#include
int main()
{
long double mon = 123.45; // 或 std::string mon = "123.45";
std::cout.imbue(std::locale("en_US.UTF-8"));
std::cout << std::showbase
<< "en_US: " << std::put_money(mon)
<< " or " << std::put_money(mon, true) << '\n';
std::cout.imbue(std::locale("ru_RU.UTF-8"));
std::cout << "ru_RU: " << std::put_money(mon)
<< " or " << std::put_money(mon, true) << '\n';
std::cout.imbue(std::locale("ja_JP.UTF-8"));
std::cout << "ja_JP: " << std::put_money(mon)
<< " or " << std::put_money(mon, true) << '\n';
}
#include
#include
#include
#include
int main()
{
std::istringstream in("$1,234.56 2.22 USD 3.33");
long double v1, v2;
std::string v3;
in.imbue(std::locale("en_US.UTF-8"));
in >> std::get_money(v1) >> std::get_money(v2) >> std::get_money(v3, true);
if (in) {
std::cout << std::quoted(in.str()) << " parsed as: "
<< v1 << ", " << v2 << ", " << v3 << '\n';
} else {
std::cout << "Parse failed";
}
}
template< class CharT > /*unspecified*/ get_time( std::tm* tmb, const CharT* fmt ); // 格式化时间值 template< class CharT > /*unspecified*/ put_time( const std::tm* tmb, const CharT* fmt );
#include
#include
#include
#include
int main()
{
std::tm t = {};
std::istringstream ss("2011-Februar-18 23:12:34");
ss.imbue(std::locale("de_DE.utf-8"));
ss >> std::get_time(&t, "%Y-%b-%d %H:%M:%S");
if (ss.fail()) {
std::cout << "Parse failed\n";
} else {
std::cout << std::put_time(&t, "%c") << '\n';
}
}
#include
#include
#include
int main()
{
std::time_t t = std::time(nullptr);
std::tm tm = *std::localtime(&t);
std::cout.imbue(std::locale("ru_RU.utf8"));
std::cout << "ru_RU: " << std::put_time(&tm, "%c %Z") << '\n';
std::cout.imbue(std::locale("ja_JP.utf8"));
std::cout << "ja_JP: " << std::put_time(&tm, "%c %Z") << '\n';
}