等同于流输出的 printf %g 标志(例如 std::cout)?

Equivalent of printf %g flag for stream output (e.g. for std::cout)?

提问人:one_two_three 提问时间:9/9/2023 最后编辑:genpfaultone_two_three 更新时间:9/9/2023 访问量:66

问:

如果我需要打印浮点数,我通常使用,因为对我来说,这是最简单和最方便的方法,可以在可能的情况下以人类可读的格式输出浮点数,并自动切换到指数形式过大或过小的值。xprintf("%g", x)

对于类似的输出流,情况就不是那么简单了。比如说,我有类在不更改流的设置的情况下重载。例如:std::coutpoint_2doperator<<

ostream& operator<<(ostream& os, const point_2d& p)
{
    os << '(' << p.x << "; " << p.y << ')';
    return os;
}

如果我这样做

std::cout << point_2d_instance << std::endl;

输出将采用此时设置的任何格式。std::cout

我无法更改实现,也不知道 的当前状态。我应该设置哪些标志才能获得等效的operator<<std::coutstd::cout

printf("(%g; %g)", p.x, p.y);
C++ Printf IOstream 库特

评论

2赞 user17732522 9/9/2023
std::defaultfloat重置格式标志,或先写入字符串,而不是直接使用 on。<<os
1赞 heap underrun 9/9/2023
正如@user17732522所说,但既然您说不能修改流的当前状态,请使用流缓冲区的临时副本并仅在副本上设置,就像这个答案一样。std::defaultfloat
2赞 Eljay 9/9/2023
如果您已使用 Boost,则可以在对流进行临时状态更改后使用 IO 状态保护程序来恢复状态。如果你不使用 Boost,那么仅仅引入这个功能可能有点大 - 但你可以出于这个目的将代码从 Boost 中移除。
0赞 Remy Lebeau 9/9/2023
为了详细说明@user17732522的评论,你可以用你想要的任何格式写到第一个,然后在准备好时写最后一个。std::ostringstreamstd::stringos

答: 暂无答案