From bf1ca6460da45526ea928fd20e53b3b4b2a22bf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ciro=20Santilli=20=E5=85=AD=E5=9B=9B=E4=BA=8B=E4=BB=B6=20?= =?UTF-8?q?=E6=B3=95=E8=BD=AE=E5=8A=9F?= Date: Wed, 13 Nov 2019 00:00:00 +0000 Subject: [PATCH] c++: copyfmt --- README.adoc | 2 ++ userland/cpp/copyfmt.cpp | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 userland/cpp/copyfmt.cpp diff --git a/README.adoc b/README.adoc index 410cf41..dd0334a 100644 --- a/README.adoc +++ b/README.adoc @@ -13834,6 +13834,8 @@ Programs under link:userland/cpp/[] are examples of https://en.wikipedia.org/wik ** link:userland/cpp/template.cpp[]: basic example ** link:userland/cpp/template_class_with_static_member.cpp[]: https://stackoverflow.com/questions/3229883/static-member-initialization-in-a-class-template ** link:userland/cpp/if_constexpr.cpp[]: C++17 `if constexpr` +* iostream +** link:userland/cpp/copyfmt.cpp[]: `std::copyfmt` restores stream state, see also: https://stackoverflow.com/questions/12560291/set-back-default-floating-point-print-precision-in-c/53673686#53673686 * fstream ** link:userland/cpp/file_write_read.cpp[] ** link:userland/cpp/temporary_directory.cpp[]: illustrates `std::filesystem::temp_directory_path` and answers https://stackoverflow.com/questions/3379956/how-to-create-a-temporary-directory-in-c/58454949#58454949 diff --git a/userland/cpp/copyfmt.cpp b/userland/cpp/copyfmt.cpp new file mode 100644 index 0000000..1dd040b --- /dev/null +++ b/userland/cpp/copyfmt.cpp @@ -0,0 +1,33 @@ +// https://cirosantilli.com/linux-kernel-module-cheat#cpp + +#include +#include +#include +#include + +int main() { + constexpr float pi = 3.14159265359; + + std::stringstream ss; + + // Sanity check default print. + ss << pi; + assert(ss.str() == "3.14159"); + ss.str(""); + + // Change precision format to scientific, + // and restore default afterwards. + std::ios ss_state(nullptr); + ss_state.copyfmt(ss); + ss << std::setprecision(2); + ss << std::scientific; + ss << pi; + assert(ss.str() == "3.14e+00"); + ss.str(""); + ss.copyfmt(ss_state); + + // Check that cout state was restored. + ss << pi; + assert(ss.str() == "3.14159"); + ss.str(""); +}