Как я могу добавить нули заполнения к числу, записанному в поток?

Я пытаюсь записать числовые значения в текстовый файл, выровненный по столбцам. Мой код выглядит так:

ofstream file;
file.open("try.txt", ios::app);
file << num << "\t" << max << "\t" << mean << "\t << a << "\n";

Это работает, за исключением того, что если значения не имеют одинакового количества цифр, они не выравниваются. Я хотел бы следующее:

1.234567  ->  1.234
1.234     ->  1.234
1.2       ->  1.200

person andrea    schedule 24.01.2012    source источник
comment
возможный дубликат вывода потока C++ с 3 цифрами после десятичная точка. Как?   -  person Paul R    schedule 24.01.2012


Ответы (4)


Это зависит от того, какой формат вы хотите. Для фиксированного десятичного разряда, что-то вроде:

class FFmt
{
    int myWidth;
    int myPrecision;
public:
    FFmt( int width, int precision )
        : myWidth( width )
        , myPrecision( precision )
    {
    }
    friend std::ostream& operator<<(
        std::ostream& dest,
        FFmt const& fmt )
    {
        dest.setf( std::ios::fixed, std::ios::floatfield );
        dest.precision( myPrecision );
        dest.width( myWidth );
    }
};

должен сделать свое дело, поэтому вы можете написать:

file << nume << '\t' << FFmt( 8, 2 ) << max ...

(или любую ширину и точность, которые вы хотите).

Если вы вообще работаете с числами с плавающей запятой, вам, вероятно, следует иметь такой манипулятор в своем комплекте взятия (хотя во многих случаях будет более подходящим использовать логический манипулятор, названный в честь логического значения данных, которые он форматирует). , например, градусы, расстояния и т. д.).

ИМХО, стоит также расширить манипуляторы, чтобы они сохраняли состояние форматирования, и восстанавливали его в конце полного выражения. (Все мои манипуляторы происходят от базового класса, который обрабатывает это.)

person James Kanze    schedule 24.01.2012

Взгляните на std::fixed, std::setw() и std::setprecision().

person NPE    schedule 24.01.2012

Сначала вам нужно изменить точность.

Хороший пример есть здесь.

person Linus Kleen    schedule 24.01.2012
comment
ответ ваш за то, что вы первый - person andrea; 24.01.2012
comment
Вам нужно указать, что вывод имеет фиксированный формат, затем указать точность и указать ширину для каждого вывода. - person James Kanze; 24.01.2012
comment
Спасибо, Андреа, но я предлагаю принять ответ Джеймса. Это куда более подробно. - person Linus Kleen; 24.01.2012

Метод тот же, что и при использовании cout. См. этот ответ.

person Samuel Harmer    schedule 24.01.2012