Каждое из следующего касается отличительного ostream
-формат. Как мне вернуть его по умолчанию?
#include <iostream>
int main()
{
std::cout << std::fixed;
std::cout << std::setprecision(5) << f << '\n';
std::cout << "scientific:\n" << std::scientific;
/*Cpp 11 standard only*/
std::cout << " hexfloat: " << std::hexfloat << 0.01 << '\n';
"The number 0.01 in default: " << std::defaultfloat << 0.01; }
}
Как в :
std::set_default?;
Также, как я выполняю
hexfloat and defaultfloat
в стандарте Cpp 98?
также в чем техническая разница между setwidth и setprecision?
По умолчанию взаимоисключающий опции std::fixed
, std::scientific
, std::hexfloat
а также std::defaultfloat
есть, ты понял std::defaultfloat
,
По умолчанию для std::setprecision
является 6
,
Точный эффект std::setw
нужно искать для каждого потока-вставки отдельно.
Замена std::defaultfloat
для pre-C ++ 11 достаточно просто:
std::ios_base& defaultfloat(std::ios_base& str) {
str.unsetf(std::ios_base::floatfield);
return str;
}
Пишу std::hexfloat
в равной степени легко, но операторы потока не будут знать, что делать с этими флагами.
Что нетривиально исправить.
Как мне вернуться, если по умолчанию
auto oldflags = std::cout.flags();
auto oldwidth = std::cout.width();
auto oldprecision = std::cout.precision();
auto oldloc = std::cout.getloc();
auto oldfill = std::cout.fill();
//**************************************************
std::cout << std::fixed;
std::cout << std::setprecision(5) << f << '\n';
std::cout << "scientific:\n" << std::scientific;
/*Cpp 11 standard only*/
std::cout << " hexfloat: " << std::hexfloat << 0.01 << '\n';
"The number 0.01 in default: " << std::defaultfloat << 0.01;
//**********************************************************
std::cout.flags(oldflags);
std::cout.width(oldwidth);
std::cout.precision(oldprecision);
std::cout.imbue(oldloc);
std::cout.fill(oldfill);
Это своего рода боль в заднице.
Кроме того, как мне выполнить hexfloat и defaultfloat в стандарте Cpp 98?
Напишите аналогичные функции самостоятельно. Это еще больше боли в заднице.
В чем техническая разница между setwidth и setprecision?
Они делают совершенно разные вещи:
Простой способ восстановить исходный формат — сохранить поток без каких-либо изменений и просто использовать copyfmt()
Например:
int main() {
std::ostream restore(0);
restore.copyfmt(std::cout);
std::cout.precision(8);
std::cout.copyfmt(restore);
}
Этот подход восстановит все различные форматы, включая значения, сохраненные с pword()
а также iword()
, Если вы хотите упаковать эту функциональность как set_default
манипулятор (вы не можете поместить его в пространство имен std
поскольку только разработчикам разрешено помещать туда имена), вы должны использовать что-то вроде этого:
template <typename cT, typemame Traits>
std::basic_ostream<cT, Traits>& set_default(std::basic_ostream<cT, Traits>& out) {
static std::basic_ostream<cT, Traits> dfault(0);
out.copyfmt(dfault);
return out;
}
Он будет использоваться как любой другой манипулятор, например:
std::cout << set_default;
У вас может быть только один поток, из которого можно восстановить исходные значения. Кроме того, вы можете сохранить формат std::cout
без изменений и, скорее, создайте отдельный поток, используя тот же буфер, но разные форматы, например,
std::ostream out(std::cout.rdbuf());
out.precision(8);
out << value;
Этот поток будет записывать в тот же поток, что и std::cout
но используйте разные флаги форматирования. Вы даже можете смешивать их, так как потоки не хранят никаких символов напрямую: это работа буфера общего потока:
std::cout << "value=";
out << value;
std::cout << '\n';
Чтобы ответить на ваш вопрос о поведении, например, defaultfloat
Это всего лишь функции манипулятора. Если вы хотите использовать их без C ++ 11, вы можете просто определить соответствующую функцию, например:
template <typename cT, typename Traits>
std::basic_ostream<cT, Traits>& defaultfloat(std::basic_ostream<cT, Traits>& out) {
out.unsetf(std::ios_base::floatfield);
return out;
}