Отключить setf в c ++?

Я использую setf для отображения десятичных знаков в выходных данных.

cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);

Однако, когда я помещаю приведенный выше код перед выводом, другие выходы также затрагиваются. Можно ли использовать setf только для одного выхода? Как выключить?

Спасибо большое!

4

Решение

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);

Читать некоторая документация.

6

Другие решения

Вы можете использовать метод 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)
2

Ваша проблема в том, что вы делитесь состоянием форматирования с кем-то еще. Очевидно, вы можете решить отслеживать изменения и исправлять их. Но есть поговорка: лучший способ решить проблему — не допустить ее возникновения.

В вашем случае вам нужно иметь свое собственное состояние форматирования и не делиться им ни с кем другим. Вы можете иметь свое собственное состояние форматирования, используя экземпляр 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

Смотрите живой пример там: жить

1
По вопросам рекламы [email protected]