简介

  • C++ 标准库

C++ 标准库

<iomanip> 是 C++ 标准库中的头文件,提供了与格式化输入输出相关的工具和操作符。这个头文件主要包含了用于控制输入输出格式的类和函数。

主要内容:

  1. 操纵符(Manipulators):
    • std::setw(int n): 设置域宽(用于下一个输出项)。
    • std::setprecision(int n): 设置浮点数的精度。
    • std::setfill(char c): 设置填充字符。
    • std::left, std::right, std::internal: 控制输出对齐方式。
    • std::boolalpha: 将布尔值输出为 “true” 或 “false”。
    • std::hex, std::dec, std::oct: 控制输出的进制。
    • 等等。
  2. 流控制:
    • std::fixed, std::scientific: 控制浮点数输出的格式。
    • std::showpoint: 总是显示小数点。
    • std::noshowpoint: 不显示小数点。
    • std::uppercase: 使用大写字母表示科学计数法中的指数。
    • std::nouppercase: 使用小写字母表示科学计数法中的指数。
    • 等等。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <iomanip>

int main() {
    int num = 123;
    double pi = 3.14159;

    std::cout << std::setw(10) << num << std::endl; // 设置域宽为 10
    std::cout << std::setprecision(3) << pi << std::endl; // 设置浮点数的精度为 3
    std::cout << std::setfill('*') << std::setw(8) << num << std::endl; // 设置域宽为 8,填充字符为 '*'
    std::cout << std::left << std::setw(8) << num << std::endl; // 左对齐
    std::cout << std::scientific << pi << std::endl; // 科学计数法输出

    return 0;
}

这个示例展示了 <iomanip> 中一些常用的格式化输出操作,如设置域宽、设置精度、设置填充字符、对齐方式、科学计数法输出等。这些操作可用于控制输入输出的格式,使输出更易读、更美观。

C++ 标准库 详解

<iomanip> 是 C++ 标准库中的头文件,提供了用于格式化输入输出的工具和操作符。它包含了多种操纵符(manipulators)、流控制器(stream control)、标志(flags)和函数,用于调整输出的格式以及控制流的行为。

主要内容:

  1. 操纵符(Manipulators):
    • std::setw(int n): 设置下一个输出项的宽度。
    • std::setprecision(int n): 设置浮点数的输出精度。
    • std::setfill(char c): 设置填充字符。
    • std::left, std::right, std::internal: 控制对齐方式。
    • std::boolalpha: 将布尔值以文本形式输出。
    • std::hex, std::dec, std::oct: 控制整数的输出进制。
    • 等等。
  2. 流控制器(Stream Control):
    • std::fixed, std::scientific: 控制浮点数的输出格式。
    • std::showpoint: 总是显示小数点。
    • std::noshowpoint: 不显示小数点。
    • std::uppercase: 使用大写字母表示科学计数法中的指数部分。
    • std::nouppercase: 使用小写字母表示科学计数法中的指数部分。
    • 等等。
  3. 标志(Flags):
    • std::ios::fmtflags: 标志位,用于控制输入输出流的格式状态。
    • std::ios::flags(): 设置或查询格式标志位。
    • std::ios::setf(), std::ios::unsetf(): 设置或取消设置格式标志位。
    • 等等。
  4. 函数:
    • std::setiosflags(), std::resetiosflags(): 设置或重置格式标志位。
    • std::get_money(), std::put_money(): 对货币值进行输入输出。
    • std::get_time(), std::put_time(): 对时间进行输入输出。
    • 等等。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <iomanip>
#include <chrono>
#include <ctime>

int main() {
    int num = 123;
    double pi = 3.14159;
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    std::time_t time = std::chrono::system_clock::to_time_t(now);

    std::cout << std::setw(10) << num << std::endl; // 设置域宽为 10
    std::cout << std::setprecision(3) << pi << std::endl; // 设置浮点数的精度为 3
    std::cout << std::setfill('*') << std::setw(8) << num << std::endl; // 设置域宽为 8,填充字符为 '*'
    std::cout << std::left << std::setw(8) << num << std::endl; // 左对齐
    std::cout << std::put_time(std::localtime(&time), "%Y-%m-%d %H:%M:%S") << std::endl; // 输出时间

    return 0;
}

以上示例展示了 <iomanip> 头文件中一些常用操作的使用方法,如设置域宽、设置精度、设置填充字符、对齐方式、时间输出等。这些操作可以用于调整输出格式以及处理特定类型的输入输出。

C++ 标准库 常用类和函数

<iomanip> 标准库提供了多种类和函数,用于格式化输入输出。以下是其中一些常用的类和函数:

常用操纵符(Manipulators):

  • std::setw(int n):设置下一个输出项的宽度为 n
  • std::setprecision(int n):设置浮点数的输出精度为 n
  • std::setfill(char c):设置填充字符为 c
  • std::left, std::right, std::internal:控制对齐方式。
  • std::boolalpha:以文本形式输出布尔值(true/false)。
  • std::hex, std::dec, std::oct:控制整数的输出进制。
  • std::fixed, std::scientific:控制浮点数的输出格式。
  • std::showpoint:总是显示小数点。
  • std::uppercase:使用大写字母表示科学计数法中的指数。
  • 等等。

流控制器(Stream Control):

  • std::ios::fmtflags:用于控制输入输出流的格式状态。
  • std::ios::flags():设置或查询格式标志位。
  • std::ios::setf(), std::ios::unsetf():设置或取消设置格式标志位。
  • std::setiosflags(), std::resetiosflags():设置或重置格式标志位。
  • 等等。

函数:

  • std::get_money(), std::put_money(): 对货币值进行输入输出。
  • std::get_time(), std::put_time(): 对时间进行输入输出。
  • 等等。

这些类和函数可用于控制输入输出流的格式,包括对宽度、精度、对齐方式、填充字符、数字格式、时间格式等进行设置和调整。

std::setw()

std::setw()<iomanip> 标准库中的操纵符(manipulator),用于设置下一个输出项的宽度。

函数签名:

1
std::setw(int n);
  • n:整数值,用于设置下一个输出项的宽度为 n
  • 返回值:std::setw() 不返回任何值。

用法示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <iomanip>

int main() {
    int num = 123;
    double pi = 3.14159;

    // 设置域宽为 10
    std::cout << std::setw(10) << num << std::endl;
    std::cout << std::setw(10) << pi << std::endl;

    return 0;
}

在上面的示例中,std::setw(10) 用于设置输出项的宽度为 10。这意味着下一个输出的内容将在占用的字符宽度上占据 10 个字符位置。如果实际内容不足以填充这个宽度,空格将被用作填充字符。

std::setprecision()

std::setprecision()<iomanip> 标准库中的操纵符(manipulator),用于设置浮点数的输出精度。

函数签名:

1
std::setprecision(int n);
  • n:整数值,用于设置浮点数的输出精度为 n
  • 返回值:std::setprecision() 不返回任何值。

用法示例:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>

int main() {
    double pi = 3.14159;

    // 设置浮点数的输出精度为 3
    std::cout << std::setprecision(3) << pi << std::endl;

    return 0;
}

在上面的示例中,std::setprecision(3) 用于设置输出浮点数的小数位精度为 3。这意味着浮点数在输出时将只显示到小数点后 3 位。

std::setfill()

std::setfill()<iomanip> 标准库中的操纵符(manipulator),用于设置填充字符。

函数签名:

1
std::setfill(char c);
  • c:字符类型,表示要设置的填充字符。
  • 返回值:std::setfill() 不返回任何值。

用法示例:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>

int main() {
    int num = 123;

    // 设置填充字符为 '*'
    std::cout << std::setfill('*') << std::setw(8) << num << std::endl;

    return 0;
}

在上面的示例中,std::setfill('*') 用于设置填充字符为星号 *,而 std::setw(8) 则用于设置输出项的宽度为 8。这意味着如果实际输出项的字符数少于 8 个,则用星号填充空余位置。

std::left()

std::left<iomanip> 标准库中的操纵符(manipulator),用于左对齐输出。

使用方法:

1
std::left

std::left 被应用于输出流之后,将使得后续的输出项(例如使用 std::setw() 设置宽度后的输出)左对齐显示。

用法示例:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>

int main() {
    int num = 123;

    // 左对齐输出
    std::cout << std::left << std::setw(8) << num << std::endl;

    return 0;
}

在上面的示例中,std::left 用于设置输出的左对齐。std::setw(8) 则用于设置输出项的宽度为 8,如果实际输出项的字符数少于 8 个,则在右侧填充空余位置以保持左对齐输出。

std::right()

std::right<iomanip> 标准库中的操纵符(manipulator),用于右对齐输出。

使用方法:

1
std::right

std::right 被应用于输出流之后,将使得后续的输出项(例如使用 std::setw() 设置宽度后的输出)右对齐显示。

用法示例:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>

int main() {
    int num = 123;

    // 右对齐输出
    std::cout << std::right << std::setw(8) << num << std::endl;

    return 0;
}

在上面的示例中,std::right 用于设置输出的右对齐。std::setw(8) 则用于设置输出项的宽度为 8,如果实际输出项的字符数少于 8 个,则在左侧填充空余位置以保持右对齐输出。

std::internal()

std::internal<iomanip> 标准库中的操纵符(manipulator),用于内部对齐输出。

使用方法:

1
std::internal

std::internal 被应用于输出流之后,将使得后续的输出项(例如使用 std::setw() 设置宽度后的输出)在输出时,数字等内部对齐。

用法示例:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>

int main() {
    int num = -123;

    // 内部对齐输出
    std::cout << std::internal << std::setw(8) << num << std::endl;

    return 0;
}

在上面的示例中,std::internal 用于设置输出的内部对齐。std::setw(8) 用于设置输出项的宽度为 8。对于带有符号的整数,使用内部对齐时,会在数字之前打印符号,并将数字右对齐。

std::boolalpha()

std::boolalpha<iomanip> 标准库中的操纵符(manipulator),用于控制布尔值的输出格式。

使用方法:

1
std::boolalpha

std::boolalpha 被应用于输出流之后,将使得后续的布尔值输出为文本形式,即 truefalse,而非默认的整数值输出(1 或 0)。

用法示例:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>

int main() {
    bool status = true;

    // 设置布尔值的输出为文本形式
    std::cout << std::boolalpha << status << std::endl;

    return 0;
}

在上面的示例中,std::boolalpha 被用于设置布尔值的输出为文本形式,所以 status 的值 true 将以文本形式输出。

std::hex()

std::hex<iomanip> 标准库中的操纵符(manipulator),用于控制整数输出的进制为十六进制。

使用方法:

1
std::hex

std::hex 被应用于输出流之后,将使得后续的整数输出为十六进制形式。

用法示例:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>

int main() {
    int num = 255;

    // 设置整数输出为十六进制形式
    std::cout << std::hex << num << std::endl;

    return 0;
}

在上面的示例中,std::hex 被用于设置整数输出为十六进制形式,所以 num 的值 255 将以十六进制形式输出为 ff

std::dex()

std::dec<iomanip> 标准库中的操纵符(manipulator),用于将整数的输出进制设置为十进制。

使用方法:

1
std::dec

std::dec 被应用于输出流之后,将使得后续的整数输出为十进制形式。

用法示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <iomanip>

int main() {
    int num = 255;

    // 设置整数输出为十六进制形式
    std::cout << std::hex << num << std::endl;

    // 设置整数输出为十进制形式
    std::cout << std::dec << num << std::endl;

    return 0;
}

在上面的示例中,首先使用 std::hex 将整数输出设置为十六进制形式输出 num 的值为 ff,然后使用 std::dec 将整数输出设置回十进制形式输出 num 的值为 255

std::oct()

std::oct<iomanip> 标准库中的操纵符(manipulator),用于将整数输出的进制设置为八进制。

使用方法:

1
std::oct

std::oct 被应用于输出流之后,将使得后续的整数输出为八进制形式。

用法示例:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>

int main() {
    int num = 255;

    // 设置整数输出为八进制形式
    std::cout << std::oct << num << std::endl;

    return 0;
}

在上面的示例中,std::oct 被用于设置整数输出为八进制形式,所以 num 的值 255 将以八进制形式输出为 377

std::fixed()

std::fixed<iomanip> 标准库中的操纵符(manipulator),用于控制浮点数的输出格式为固定点表示法(fixed-point notation)。

使用方法:

1
std::fixed

std::fixed 被应用于输出流之后,将使得后续的浮点数输出使用固定的小数点位数(小数部分不会自动省略)。

用法示例:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>

int main() {
    double value = 123.456789;

    // 设置浮点数输出为固定点表示法
    std::cout << std::fixed << value << std::endl;

    return 0;
}

在上面的示例中,std::fixed 被用于设置浮点数的输出格式为固定点表示法,因此 value 的值 123.456789 将以固定的小数点位数输出为 123.456789

std::scientific

std::scientific<iomanip> 标准库中的操纵符(manipulator),用于控制浮点数的输出格式为科学计数法(scientific notation)。

使用方法:

1
std::scientific

std::scientific 被应用于输出流之后,将使得后续的浮点数输出使用科学计数法表示。

用法示例:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>

int main() {
    double value = 123456.789;

    // 设置浮点数输出为科学计数法
    std::cout << std::scientific << value << std::endl;

    return 0;
}

在上面的示例中,std::scientific 被用于设置浮点数的输出格式为科学计数法,因此 value 的值 123456.789 将以科学计数法形式输出为 1.234568e+05

std::showpoint()

std::showpoint() 是 C++ 中用于控制输出浮点数的标志之一。它用于在输出浮点数时始终显示小数点,并显示末尾的零。在使用它后,无论小数部分是否为零,都会显示小数点和末尾的零。

在中文中,std::showpoint() 可以翻译为 “显示小数点”,用于指示程序在输出浮点数时应始终显示小数点及其后的零。

std::noshowpoint()

std::noshowpoint() 是 C++ 中用于控制浮点数输出的标志之一。它用于取消使用 std::showpoint() 设置,即停止在输出浮点数时始终显示小数点及其后的零。

在中文中,std::noshowpoint() 可以翻译为 “不显示小数点”,用于指示程序在输出浮点数时不显示小数点及其后的零。

std::uppercase

std::uppercase 是 C++ 中用于控制输出的标志之一,它用于设置输出中的字母部分为大写字母。通常,它与输出十六进制数字时一起使用,以确保字母部分以大写形式显示。

例如,当使用输出操作符 << 将整数以十六进制格式输出时,设置了 std::uppercase 标志后,输出的字母部分(A-F)将以大写字母显示。

在中文中,std::uppercase 可以翻译为 “大写”,表示将输出转换为大写形式。

std::nouppercase

std::nouppercase 是 C++ 中用于控制输出的标志之一,它用于取消设置输出中字母部分为大写字母的状态,即停止将输出的字母部分强制转换为大写形式。

通常情况下,std::nouppercase 用于取消之前设置的 std::uppercase 标志,使得输出的字母部分恢复到默认的小写形式。

在中文中,std::nouppercase 可以翻译为 “不大写”,表示取消将输出转换为大写形式的设置。

std::ios::fmtflags

std::ios::fmtflags 是 C++ 中的一种数据类型,用于表示输入/输出流的格式标志。它是 std::ios 类的一部分,用于存储各种控制输出格式的标志位,比如用于控制流的各种格式设置,如对齐、小数点精度、数制、浮点数的显示方式等等。

这个类型通常用于控制输出格式的相关设置,例如 std::ios::hex 用于设置输出流的进制为十六进制,std::ios::scientific 用于设置输出流的科学计数法等等。

它是一个位掩码枚举类型,意味着它的值可以是多个位的组合。通过将各种格式标志进行按位或操作,可以创建包含多个格式标志的组合。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>

int main() {
    std::ios::fmtflags flags = std::cout.flags(); // 获取当前输出流的格式标志

    flags |= std::ios::hex; // 设置输出流的进制为十六进制
    flags &= ~std::ios::dec; // 取消输出流的十进制设置

    std::cout.flags(flags); // 应用新的格式标志

    return 0;
}

这里的 std::ios::fmtflags 用于存储输出流的格式标志,可以随后使用按位操作符进行修改,并通过 std::cout.flags()std::cout.flags(flags) 方法来获取和设置流的格式标志。

std::ios::flags

std::ios::flags 是 C++ 中的一个成员函数,而非数据类型。这个函数用于设置流的格式标志(flags),它属于 std::ios 类的一部分,用于控制输入/输出流的格式。

这个成员函数的作用是设置流的格式控制标志。它接受一个参数,该参数是一个 std::ios::fmtflags 类型的值,这个值包含了要设置的格式标志的组合。

例如,可以使用 std::ios::hex 标志将输出流的进制设置为十六进制。示例代码如下:

1
2
3
4
5
6
7
8
#include <iostream>

int main() {
    std::cout.setf(std::ios::hex); // 设置输出流的进制为十六进制
    std::cout << 255 << std::endl; // 输出 255 的十六进制表示

    return 0;
}

在这个例子中,std::cout.setf(std::ios::hex) 用于设置输出流的格式标志为十六进制格式。接下来的 std::cout << 255 << std::endl 将以十六进制形式输出整数 255。

std::ios::flags 函数主要用于设置输出流的格式标志,以控制输出流的显示格式,比如控制进制、对齐方式、浮点数的显示方式等等。

std::ios::setf()

std::ios::setf() 是 C++ 中用于设置流的格式标志的成员函数之一。它属于 std::ios 类的一部分,用于控制输入/输出流的格式。

这个函数允许你设置指定的格式标志,接受一个参数,即格式标志的组合。你可以使用这个函数来设置需要的格式标志,例如设置浮点数的显示方式、数制、对齐方式等等。

示例代码如下:

1
2
3
4
5
6
7
8
#include <iostream>

int main() {
    std::cout.setf(std::ios::hex); // 设置输出流的进制为十六进制
    std::cout << 255 << std::endl; // 输出 255 的十六进制表示

    return 0;
}

在这个例子中,std::cout.setf(std::ios::hex) 被用来设置输出流的格式标志为十六进制格式。接下来的 std::cout << 255 << std::endl 将以十六进制形式输出整数 255。

std::ios::setf() 函数是 std::ios 类中用于设置格式标志的函数之一,用于控制输出流的显示格式。

std::ios::unsetf()

std::unsetf() 是 C++ 中用于取消流的格式标志的成员函数之一,属于 std::ios 类的一部分。它允许你取消特定的格式标志,将其从流的当前格式状态中移除。

这个函数接受一个参数,即要取消的格式标志。它可以取消先前通过 std::ios::setf() 或其他设置格式标志的方式设置的标志。

示例代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>

int main() {
    std::cout.setf(std::ios::hex); // 设置输出流的进制为十六进制
    std::cout << 255 << std::endl; // 输出 255 的十六进制表示

    std::cout.unsetf(std::ios::hex); // 取消输出流的十六进制格式标志

    std::cout << 255 << std::endl; // 输出 255 的默认十进制表示

    return 0;
}

在这个例子中,首先使用 std::cout.setf(std::ios::hex) 设置了输出流的格式标志为十六进制格式。接下来的 std::cout << 255 << std::endl 输出了整数 255 的十六进制表示。

然后使用 std::cout.unsetf(std::ios::hex) 取消了输出流的十六进制格式标志。最后的 std::cout << 255 << std::endl 输出了整数 255 的默认十进制表示,因为已取消了十六进制格式标志。

std::ios::unsetf() 函数用于取消先前设置的特定格式标志,以便在输出流的格式状态中移除该标志。

std::setiosflags()

std::setiosflags() 是 C++ 中用于设置流格式标志的函数之一,用于控制输入/输出流的格式。这个函数可以设置指定的格式标志,其效果类似于 std::ios::setf()

1
2
3
4
5
6
7
8
#include <iostream>

int main() {
    std::cout << std::setiosflags(std::ios::hex); // 设置输出流的进制为十六进制
    std::cout << 255 << std::endl; // 输出 255 的十六进制表示

    return 0;
}

在这个例子中,std::setiosflags(std::ios::hex) 被用来设置输出流的格式标志为十六进制格式。接下来的 std::cout << 255 << std::endl 将以十六进制形式输出整数 255。

std::setiosflags() 可以用于设置指定的格式标志,与 std::ios::setf() 类似,允许控制输出流的显示格式。

std::resetiosflags()

std::resetiosflags() 是 C++ 中用于重置流的格式标志的函数之一,用于控制输入/输出流的格式。它的作用是取消指定的格式标志,将其从流的当前格式状态中移除。

这个函数接受一个参数,即要重置的格式标志。它可以用来取消先前通过 std::ios::setf()std::setiosflags() 或其他设置格式标志的方式设置的标志。

示例代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <iomanip>

int main() {
    std::cout.setf(std::ios::hex); // 设置输出流的进制为十六进制
    std::cout << 255 << std::endl; // 输出 255 的十六进制表示

    std::cout << std::resetiosflags(std::ios::hex); // 重置输出流的十六进制格式标志

    std::cout << 255 << std::endl; // 输出 255 的默认十进制表示

    return 0;
}

在这个例子中,首先使用 std::cout.setf(std::ios::hex) 设置了输出流的格式标志为十六进制格式。接下来的 std::cout << 255 << std::endl 输出了整数 255 的十六进制表示。

然后使用 std::cout << std::resetiosflags(std::ios::hex) 重置了输出流的十六进制格式标志。最后的 std::cout << 255 << std::endl 输出了整数 255 的默认十进制表示,因为已经重置了十六进制格式标志。

std::resetiosflags() 函数用于取消先前设置的特定格式标志,以便从输出流的格式状态中移除该标志。

std::get_money()

std::get_money() 是 C++ 标准库 <iomanip> 头文件中提供的一个函数,用于将字符串解析为货币值,并将其存储到 std::money_get 类型对象返回的结果中。它通常与 std::put_money() 一起使用,后者用于将货币值以指定的格式输出到输出流中。

这个函数的声明如下:

1
2
std::money_get<charT, InputIterator> get_money(
    T &val, bool intl = false);

其中:

  • charT 是字符类型。
  • InputIterator 是输入迭代器类型。
  • val 是要存储货币值的对象。
  • intl 是一个布尔值,指示货币值是否采用国际化格式(如果为 true,则表示使用国际化货币格式)。

例如,可以使用 std::get_money() 将字符串解析为货币值,然后将其输出到输出流中。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <iomanip>
#include <locale>

int main() {
    std::string input = "123.45"; // 要解析的字符串
    std::stringstream ss(input); // 创建字符串流

    double value;
    std::locale loc(std::locale(), new std::moneypunct<char, false>);
    std::moneypunct_byname<char, false> const& mpunct = std::use_facet<std::moneypunct_byname<char, false>>(loc);

    std::ios_base::iostate err;
    ss.imbue(loc);
    ss >> std::get_money(value, false);

    if (ss.fail()) {
        std::cout << "Parsing failed\n";
    } else {
        std::cout << "Parsed value: " << value << '\n';
    }

    return 0;
}

在这个例子中,字符串 “123.45” 被解析为货币值,存储在 value 中,并输出到标准输出流中。需要注意的是,这是一个简化的示例,实际的用法可能涉及更多的设置和错误处理。

std::put_money()

std::put_money() 是 C++ 标准库 <iomanip> 头文件中提供的一个函数,用于将货币值以指定的格式输出到输出流中。通常与 std::get_money() 一起使用,后者用于将字符串解析为货币值。

这个函数的声明如下:

1
2
std::money_put<charT, OutputIterator> put_money(
    std::basic_ostream<charT>& os, bool intl, T val);

其中:

  • charT 是字符类型。
  • OutputIterator 是输出迭代器类型。
  • os 是要写入的输出流。
  • intl 是一个布尔值,指示货币值是否采用国际化格式(如果为 true,则表示使用国际化货币格式)。
  • val 是要输出的货币值。

例如,可以使用 std::put_money() 将货币值以指定的格式输出到输出流中。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <iomanip>
#include <locale>

int main() {
    double value = 123.45; // 要输出的货币值

    std::cout.imbue(std::locale("en_US.UTF-8")); // 设置本地化信息
    std::cout << "Formatted output: " << std::put_money(value, true) << std::endl;

    return 0;
}

在这个例子中,货币值 123.45 被以国际化的货币格式输出到标准输出流中。这是一个简化的示例,实际的用法可能涉及更多的设置和本地化信息的处理。

std::get_time()

std::get_time() 是 C++ 中 <iomanip> 头文件中提供的函数,用于将字符串解析为时间对象 std::tm。这个函数允许你从字符串中提取日期和时间信息,并将其存储在 std::tm 结构中。

这个函数的声明如下:

1
2
3
4
std::istreambuf_iterator<charT> get_time(
    std::istreambuf_iterator<charT>& s,
    const charT* fmt,
    std::tm* tmb);

其中:

  • charT 是字符类型。
  • s 是指向输入流的迭代器。
  • fmt 是描述日期和时间格式的 C 字符串。
  • tmb 是指向 std::tm 结构的指针,用于存储解析后的日期和时间信息。

示例代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <iomanip>
#include <ctime>

int main() {
    std::tm tmb;
    std::istringstream ss("2023-12-09 15:30:00"); // 要解析的时间字符串
    ss >> std::get_time(&tmb, "%Y-%m-%d %H:%M:%S"); // 解析时间字符串并存储到 std::tm 结构中

    if (ss.fail()) {
        std::cout << "Parsing failed\n";
    } else {
        std::cout << "Parsed date and time: "
                  << std::put_time(&tmb, "%Y-%m-%d %H:%M:%S") << std::endl;
    }

    return 0;
}

在这个例子中,字符串 “2023-12-09 15:30:00” 被解析为时间对象 std::tm,并存储在 tmb 中。然后,std::put_time() 被用于格式化输出解析后的日期和时间信息。如果解析失败,将输出 “Parsing failed”。这是一个简化的示例,实际的用法可能涉及更多的错误处理和格式化字符串。

std::put_time()

std::put_time() 是 C++ 中 <iomanip> 头文件中提供的一个函数,用于将时间对象 std::tm 按照指定的格式输出为字符串。

这个函数的声明如下:

1
2
3
std::ostreambuf_iterator<charT> put_time(
    const std::tm* tmb,
    const charT* fmt);

其中:

  • tmb 是指向 std::tm 结构的指针,包含要格式化的时间信息。
  • fmt 是描述日期和时间格式的 C 字符串。

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <iomanip>
#include <ctime>

int main() {
    std::tm timeinfo = {}; // 初始化时间结构
    timeinfo.tm_year = 2023 - 1900; // 年份减去1900
    timeinfo.tm_mon = 11; // 月份,0-11 表示一月到十二月
    timeinfo.tm_mday = 9; // 日
    timeinfo.tm_hour = 15; // 时
    timeinfo.tm_min = 30; // 分
    timeinfo.tm_sec = 0; // 秒

    std::cout << "Formatted time: " << std::put_time(&timeinfo, "%Y-%m-%d %H:%M:%S") << std::endl;

    return 0;
}

在这个示例中,std::put_time() 被用于格式化输出 std::tm 结构中的时间信息。指定的格式字符串 "%Y-%m-%d %H:%M:%S" 代表了年月日时分秒的格式。这样的调用将会把时间信息格式化为字符串,并输出到标准输出流中。

需要注意的是,std::put_time() 在 C++11 中引入,用于便捷地格式化时间信息并输出为字符串。

C++ std::put_time() 函数返回值存储到字符串

你可以使用std::put_time()函数结合std::stringstream将格式化后的时间存储到字符串中。下面是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <chrono>
#include <iomanip>
#include <sstream>

int main() {
    // 获取当前时间点
    auto now = std::chrono::system_clock::now();

    // 将时间点转换为时间结构体
    std::time_t now_c = std::chrono::system_clock::to_time_t(now);
    std::tm* now_tm = std::localtime(&now_c);

    // 使用 std::put_time 格式化时间
    std::stringstream ss;
    ss << std::put_time(now_tm, "%Y-%m-%d %H:%M:%S");

    // 将格式化后的时间存储到字符串中
    std::string formatted_time = ss.str();

    // 输出格式化后的时间字符串
    std::cout << "Formatted Time: " << formatted_time << std::endl;

    return 0;
}

这段代码中,std::put_time()函数用于将时间结构体格式化为指定格式的字符串。然后,使用std::stringstream来存储这个格式化后的字符串,最后将其转换为std::string类型。