Я использую setf для отображения десятичных знаков в выходных данных.
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
Однако, когда я помещаю приведенный выше код перед выводом, другие выходы также затрагиваются. Можно ли использовать setf только для одного выхода? Как выключить?
Спасибо большое!
setf
возвращает исходное значение флага, так что вы можете просто сохранить его, а затем вернуть его, когда закончите.
То же самое относится и к 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
Смотрите живой пример там: жить