在 C++ 中关闭 setf?
Turn off setf in c++?
我正在使用 setf in 在输出中显示小数位。
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
但是,当我将上面的代码放在输出之前时,其他输出也会受到影响。有什么办法可以只将 setf 用于单个输出吗?喜欢关掉它吗?
非常感谢!
setf
returns 原始标志值,因此您可以简单地存储它,然后在完成后将其放回原处。
precision
也是如此。
所以:
// Change flags & precision (storing original values)
const auto original_flags = std::cout.setf(std::ios::fixed | std::ios::showpoint);
const auto original_precision = std::cout.precision(2);
// Do your I/O
std::cout << someValue;
// Reset the precision, and affected flags, to their original values
std::cout.setf(original_flags, std::ios::fixed | std::ios::showpoint);
std::cout.precision(original_precision);
您可以使用 flags() 方法保存和恢复所有标志或 unsetf() setf
返回的标志
std::ios::fmtflags oldFlags( cout.flags() );
cout.setf(std::ios::fixed);
cout.setf(std::ios::showpoint);
std::streamsize oldPrecision(cout.precision(2));
// output whatever you should.
cout.flags( oldFlags );
cout.precision(oldPrecision)
您的问题是您与其他人共享了格式化状态。显然,您可以决定跟踪更改并更正它们。但有句话说:解决问题最好的方法就是预防它发生
在您的情况下,您需要拥有自己的格式化状态并且不与其他任何人共享。您可以使用 std::ostream
的实例和与 std::cout
.
具有相同底层流缓冲区的实例来拥有自己的格式化状态
std::ostream my_fmt(std::cout.rdbuf());
my_fmt.setf(std::ios::fixed);
my_fmt.setf(std::ios::showpoint);
my_fmt.precision(2);
// output that could modify fmt flags
std::cout.setf(std::ios::scientific);
std::cout.precision(1);
// ----
// output some floats with my format independently of what other code did
my_fmt << "my format: " << 1.234 << "\n";
// output some floats with the format that may impacted by other code
std::cout << "std::cout format: " << 1.234 << "\n";
这将输出:
my format: 1.23
std::cout format: 1.2e+00
查看现场示例:live
我正在使用 setf in 在输出中显示小数位。
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
但是,当我将上面的代码放在输出之前时,其他输出也会受到影响。有什么办法可以只将 setf 用于单个输出吗?喜欢关掉它吗?
非常感谢!
setf
returns 原始标志值,因此您可以简单地存储它,然后在完成后将其放回原处。
precision
也是如此。
所以:
// Change flags & precision (storing original values)
const auto original_flags = std::cout.setf(std::ios::fixed | std::ios::showpoint);
const auto original_precision = std::cout.precision(2);
// Do your I/O
std::cout << someValue;
// Reset the precision, and affected flags, to their original values
std::cout.setf(original_flags, std::ios::fixed | std::ios::showpoint);
std::cout.precision(original_precision);
您可以使用 flags() 方法保存和恢复所有标志或 unsetf() setf
返回的标志 std::ios::fmtflags oldFlags( cout.flags() );
cout.setf(std::ios::fixed);
cout.setf(std::ios::showpoint);
std::streamsize oldPrecision(cout.precision(2));
// output whatever you should.
cout.flags( oldFlags );
cout.precision(oldPrecision)
您的问题是您与其他人共享了格式化状态。显然,您可以决定跟踪更改并更正它们。但有句话说:解决问题最好的方法就是预防它发生
在您的情况下,您需要拥有自己的格式化状态并且不与其他任何人共享。您可以使用 std::ostream
的实例和与 std::cout
.
std::ostream my_fmt(std::cout.rdbuf());
my_fmt.setf(std::ios::fixed);
my_fmt.setf(std::ios::showpoint);
my_fmt.precision(2);
// output that could modify fmt flags
std::cout.setf(std::ios::scientific);
std::cout.precision(1);
// ----
// output some floats with my format independently of what other code did
my_fmt << "my format: " << 1.234 << "\n";
// output some floats with the format that may impacted by other code
std::cout << "std::cout format: " << 1.234 << "\n";
这将输出:
my format: 1.23
std::cout format: 1.2e+00
查看现场示例:live