C/C++编程:输入输出操作符

操纵符是令代码能以 operator<< 或 operator>> 控制输入/输出流的帮助函数。

std::dec, std::hex, std::oct,std::setbase

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';
}

C/C++编程:输入输出操作符_第1张图片

std::setprecision

/*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::fixed, std::scientific, std::hexfloat, std::defaultfloat

定义于头文件 
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';
}

C/C++编程:输入输出操作符_第2张图片

std::boolalpha, std::noboolalpha

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::showbase, std::noshowbase

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::showpoint, std::noshowpoint

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::showpos, std::noshowpos

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::skipws, std::noskipws,std::ws

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::uppercase, std::nouppercase

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';
}

std::setfill、std::left, std::right, std::internal

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';
}

C/C++编程:输入输出操作符_第3张图片

std::unitbuf, std::nounitbuf

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 标志

std::ends

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);
    }
}

C/C++编程:输入输出操作符_第4张图片

std::resetiosflags

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';
}

std::setw

/*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";
}

std::get_money、std::put_money

template< class MoneyT >
/*unspecified*/ get_money( MoneyT& mon, bool intl = false );   // 解析货币值

template< class MoneyT >
/*unspecified*/ put_money( const MoneyT& mon, bool intl = false );  // 格式化并输出货币值

操纵符是令代码能以 operator<< 或 operator>> 控制输入/输出流的帮助函数。

std::dec, std::hex, std::oct,std::setbase

std::ios_base& dec( std::ios_base& str );
std::ios_base& hex( std::ios_base& str );
std::ios_base& oct( std::ios_base& str );

C/C++编程:输入输出操作符_第5张图片

修改整数 I/O 的默认数值底。

1) 如同以调用 str.setf(std::ios_base::dec, std::ios_base::basefield) 设置流 strbasefielddec

2) 如同以调用 str.setf(std::ios_base::hex, std::ios_base::basefield) 设置流 strbasefieldhex

3) 如同以调用 str.setf(std::ios_base::oct, std::ios_base::basefield) 设置流 strbasefieldoct

setbase( int base );

C/C++编程:输入输出操作符_第6张图片

设置流的数值底。用于表达式 out << setbase(base) 或 in >> setbase(base) 时,取决于 base 的值,更改流 outinbasefield 标志:

  • 值 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';
}

C/C++编程:输入输出操作符_第7张图片

C/C++编程:输入输出操作符_第8张图片

#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';
}

C/C++编程:输入输出操作符_第9张图片

C/C++编程:输入输出操作符_第10张图片C/C++编程:输入输出操作符_第11张图片

std::setprecision

/*unspecified*/ setprecision( int n );

C/C++编程:输入输出操作符_第12张图片

更改浮点数精度

#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';
}

C/C++编程:输入输出操作符_第13张图片

C/C++编程:输入输出操作符_第14张图片

std::fixed, std::scientific, std::hexfloat, std::defaultfloat

定义于头文件 
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 );

C/C++编程:输入输出操作符_第15张图片

修改浮点输入/输出的默认格式化。

1) 如同以调用 str.setf(std::ios_base::fixed, std::ios_base::floatfield) ,设置流 strfloatfieldfixed

2) 如同以调用 str.setf(std::ios_base::scientific, std::ios_base::floatfield) ,设置流 strfloatfieldscientific

3) 如同以调用 str.setf(std::ios_base::fixed | std::ios_base::scientific, std::ios_base::floatfield) ,设置流 strfloatfield 同为 fixedscientific 。这启用十六进制浮点格式化。

4) 如同以调用 str.unsetf(std::ios_base::floatfield) ,设置流 strfloatfield 为零,这异于 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';
}

C/C++编程:输入输出操作符_第16张图片

C/C++编程:输入输出操作符_第17张图片C/C++编程:输入输出操作符_第18张图片

std::boolalpha, std::noboolalpha

std::ios_base& boolalpha( std::ios_base& str );
std::ios_base& noboolalpha( std::ios_base& str );

C/C++编程:输入输出操作符_第19张图片

在布尔值的文本和数值表示间切换

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';
}

C/C++编程:输入输出操作符_第20张图片

C/C++编程:输入输出操作符_第21张图片

std::showbase, std::noshowbase

std::ios_base& showbase( std::ios_base& str );
std::ios_base& noshowbase( std::ios_base& str );

C/C++编程:输入输出操作符_第22张图片

控制是否使用前缀指示数值基数

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';
}

C/C++编程:输入输出操作符_第23张图片

C/C++编程:输入输出操作符_第24张图片

std::showpoint, std::noshowpoint

std::ios_base& showpoint( std::ios_base& str );
std::ios_base& noshowpoint( std::ios_base& str );

C/C++编程:输入输出操作符_第25张图片

启用或禁用浮点输出中的无条件小数点包含。在输入上无效果。

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';
}

C/C++编程:输入输出操作符_第26张图片

C/C++编程:输入输出操作符_第27张图片

std::showpos, std::noshowpos

std::ios_base& showpos( std::ios_base& str );
std::ios_base& noshowpos( std::ios_base& str );

C/C++编程:输入输出操作符_第28张图片

启用或禁用非负数输出中的正号 '+' 的显示。在输入上无效果。

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';
}

C/C++编程:输入输出操作符_第29张图片

C/C++编程:输入输出操作符_第30张图片

std::skipws, std::noskipws,std::ws

std::ios_base& skipws( std::ios_base& str );
std::ios_base& noskipws( std::ios_base& str );

C/C++编程:输入输出操作符_第31张图片

启用或禁用有格式输入函数所做的跳过前导空白符(默认启用)。在输出上无效果。 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 );

C/C++编程:输入输出操作符_第32张图片

从输入流舍弃前导空白符。

#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';
}

C/C++编程:输入输出操作符_第33张图片

C/C++编程:输入输出操作符_第34张图片

#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";
}

C/C++编程:输入输出操作符_第35张图片

C/C++编程:输入输出操作符_第36张图片

std::uppercase, std::nouppercase

std::ios_base& uppercase( std::ios_base& str );
std::ios_base& nouppercase( std::ios_base& str );

C/C++编程:输入输出操作符_第37张图片

启用浮点和十六进制整数输出中大写字符的使用。在输入时无效果。

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';
}

C/C++编程:输入输出操作符_第38张图片

C/C++编程:输入输出操作符_第39张图片

std::setfill、std::left, std::right, std::internal

template< class CharT >
/*unspecified*/ setfill( CharT c );

C/C++编程:输入输出操作符_第40张图片

用于表达式 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 );

C/C++编程:输入输出操作符_第41张图片

修改填充字符的默认定位。 leftright 应用到任何输出,而 internal 应用到整数、浮点和货币输出。在输入时无效果。

1) 如同用调用 str.setf(std::ios_base::left, std::ios_base::adjustfield) ,设置流 stradjustfieldleft

2) 如同用调用 str.setf(std::ios_base::right, std::ios_base::adjustfield) ,设置流 stradjustfieldright

3) 如同用调用 str.setf(std::ios_base::internal, std::ios_base::adjustfield) ,设置流 stradjustfieldinternal

#include 
#include 
int main()
{
    std::cout << "default fill: " << std::setw(10) << 42 << '\n'
              << "setfill('*'): " << std::setfill('*')
                                  << std::setw(10) << 42 << '\n';
}

C/C++编程:输入输出操作符_第42张图片

``C/C++编程:输入输出操作符_第43张图片````

#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';
}

C/C++编程:输入输出操作符_第44张图片

C/C++编程:输入输出操作符_第45张图片C/C++编程:输入输出操作符_第46张图片

std::unitbuf, std::nounitbuf

std::ios_base& unitbuf( std::ios_base& str );
std::ios_base& nounitbuf( std::ios_base& str );

C/C++编程:输入输出操作符_第47张图片

启用或禁用任何输出操作后的自动fflush。在输入时无效果。

1) 如同用调用 str.setf(std::ios_base::unitbuf) 启用流 str 中的 unitbuf 标志

2) 如同用调用 str.unsetf(std::ios_base::unitbuf) 禁用流 str 中的 unitbuf 标志

std::ends

template< class CharT, class Traits >
std::basic_ostream& ends( std::basic_ostream& os );

C/C++编程:输入输出操作符_第48张图片

输出 '\0'

template< class CharT, class Traits >
std::basic_ostream& endl( std::basic_ostream& os );

C/C++编程:输入输出操作符_第49张图片

输出 '\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); // 启用内存解分配
}

C/C++编程:输入输出操作符_第50张图片

#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);
    }
}

C/C++编程:输入输出操作符_第51张图片

C/C++编程:输入输出操作符_第52张图片C/C++编程:输入输出操作符_第53张图片

std::resetiosflags

resetiosflags( std::ios_base::fmtflags mask );

C/C++编程:输入输出操作符_第54张图片

用于表达式 out << resetiosflags(mask) 或 in >> resetiosflags(mask) 中时,清除流 outinmask 所指定的所有格式标志。

setiosflags( std::ios_base::fmtflags mask );

C/C++编程:输入输出操作符_第55张图片

用于表达式 out << setiosflags(mask) 或 in >> setiosflags(mask) 时,设置流 outin 的所有格式标志为 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';
}

C/C++编程:输入输出操作符_第56张图片

C/C++编程:输入输出操作符_第57张图片

#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';
}

C/C++编程:输入输出操作符_第58张图片

C/C++编程:输入输出操作符_第59张图片

std::setw

/*unspecified*/ setw( int n );

C/C++编程:输入输出操作符_第60张图片

更改下个输入/输出域的宽度

#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";
}

C/C++编程:输入输出操作符_第61张图片

C/C++编程:输入输出操作符_第62张图片

std::get_money、std::put_money

template< class MoneyT >
/*unspecified*/ get_money( MoneyT& mon, bool intl = false );   // 解析货币值
​
template< class MoneyT >
/*unspecified*/ put_money( const MoneyT& mon, bool intl = false );  // 格式化并输出货币值

C/C++编程:输入输出操作符_第63张图片

mon - 要被写入货币值的变量。能为 long double 或 basic_string 之一
intl - 若为 true 则期待找到要求的国际通货字符串,否则期待可选的通货符号
#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';
}

C/C++编程:输入输出操作符_第64张图片

C/C++编程:输入输出操作符_第65张图片

#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";
    }
}

C/C++编程:输入输出操作符_第66张图片

C/C++编程:输入输出操作符_第67张图片

std::get_time

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 );

C/C++编程:输入输出操作符_第68张图片

#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';
    }
}

C/C++编程:输入输出操作符_第69张图片

C/C++编程:输入输出操作符_第70张图片

#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';
}

C/C++编程:输入输出操作符_第71张图片

C/C++编程:输入输出操作符_第72张图片

   
     
#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";
    }
}

std::get_time

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';
}

 

 

 

 

你可能感兴趣的:(C++)