форматирование std :: cout в стандарте Cpp 98

Каждое из следующего касается отличительного 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?

0

Решение

По умолчанию взаимоисключающий опции 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 в равной степени легко, но операторы потока не будут знать, что делать с этими флагами.
Что нетривиально исправить.

2

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

Как мне вернуться, если по умолчанию

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?

Они делают совершенно разные вещи:

  • ширина — ширина поля определяет минимальное количество символов быть записанным в некоторых выходных представлениях. Если стандартная ширина представления короче ширины поля, представление дополняется символами заполнения в точке, определяемой полем настройки флага формата (один из левого, правого или внутреннего).
  • точность — точность с плавающей точкой определяет максимальное количество цифр, которые будут записаны в операциях вставки для выражения значений с плавающей точкой. То, как это интерпретируется, зависит от того, установлен ли флаг формата float для конкретной нотации (либо фиксированной, либо научной), либо он не установлен (используется нотация по умолчанию, которая не обязательно эквивалентна ни фиксированной, ни научной). Для локали по умолчанию:
    • Используя стандартную запись с плавающей точкой, поле точности определяет максимальное количество значащих цифр для отображения в общем подсчете как до, так и после десятичной точки. Обратите внимание, что это не минимум, и поэтому он не дополняет отображаемое число конечными нулями, если число может отображаться с меньшим количеством цифр, чем точность.
    • Как в фиксированной, так и в научной нотациях поле точности определяет сколько именно цифр отображать после десятичной точки, даже если это включает в себя конечные десятичные нули. В этом случае цифры перед десятичной запятой не имеют значения для точности.
1

Простой способ восстановить исходный формат — сохранить поток без каких-либо изменений и просто использовать 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;
}
1
По вопросам рекламы [email protected]