Uitvoer formatteren in C++

In een C++-code heb ik een matrix van dubbele variabelen die ik uitprint. Omdat ze echter allemaal een ander aantal cijfers hebben, wordt het uitvoerformaat vernietigd. Een oplossing is om te doen
cout.precision(5)maar ik wil dat verschillende kolommen een andere precisie hebben. Omdat er in sommige gevallen ook negatieve waarden zijn, veroorzaakt de aanwezigheid van het -teken ook problemen. Hoe dit te omzeilen en een correct geformatteerde uitvoer te produceren?


Antwoord 1, autoriteit 100%

Uit mijn hoofd, je kunt setw(int) gebruiken om de breedte van de uitvoer te specificeren.

zoals dit:

std::cout << std::setw(5) << 0.2 << std::setw(10) << 123456 << std::endl;
std::cout << std::setw(5) << 0.12 << std::setw(10) << 123456789 << std::endl;

geeft dit:

   0.2    123456
   0.12 123456789

Antwoord 2, autoriteit 80%

De sleutel is, zoals anderen al hebben gezegd, om manipulatoren te gebruiken. Wat zij
verwaarloosd te zeggen is dat je normaal gesproken manipulatoren gebruikt die je schrijft
jezelf. Een FFmtmanipulator (die overeenkomt met het Fformaat in
Fortran is vrij eenvoudig:

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_base::fixed, std::ios_base::formatfield );
        dest.precision( myPrecision );
        dest.width( myWidth );
        return dest;
    }
};

Op deze manier kunt u voor elke kolom een variabele definiëren, bijvoorbeeld:

FFmt col1( 8, 2 );
FFmt col2( 6, 3 );
//  ...

en schrijf:

std::cout  << col1 << value1
    << ' ' << col2 << value2...

In het algemeen, behalve in de eenvoudigste programma’s, zou je dat waarschijnlijk niet moeten doen
met behulp van de standaard manipulatoren, maar eerder aangepaste manipulatoren gebaseerd op
jouw toepassing; bijv. temperatureen pressureals dat het soort is
waar je mee te maken hebt. Op deze manier is het duidelijk in de code wat
u aan het formatteren bent, en als de klant plotseling om nog een cijfer vraagt in
de druk, weet je precies waar je de verandering moet doorvoeren.


Antwoord 3, autoriteit 40%

Gebruik manipulatoren.

Uit voorbeeld hier:

#include <iostream>
#include <iomanip>
#include <locale>
int main()
{
    std::cout.imbue(std::locale("en_US.utf8"));
    std::cout << "Left fill:\n" << std::left << std::setfill('*')
              << std::setw(12) << -1.23  << '\n'
              << std::setw(12) << std::hex << std::showbase << 42 << '\n'
              << std::setw(12) << std::put_money(123, true) << "\n\n";
    std::cout << "Internal fill:\n" << std::internal
              << std::setw(12) << -1.23  << '\n'
              << std::setw(12) << 42 << '\n'
              << std::setw(12) << std::put_money(123, true) << "\n\n";
    std::cout << "Right fill:\n" << std::right
              << std::setw(12) << -1.23  << '\n'
              << std::setw(12) << 42 << '\n'
              << std::setw(12) << std::put_money(123, true) << '\n';
}

Uitvoer:

Left fill:
-1.23*******
0x2a********
USD *1.23***
Internal fill:
-*******1.23
0x********2a
USD ****1.23
Right fill:
*******-1.23
********0x2a
***USD *1.23

Antwoord 4, autoriteit 15%

Kijk eens naar stream manipulatoren, vooral std::setwen std::setfill.

float f = 3.1415926535;
std::cout << std::setprecision(5)   // precision of floating point output
          << std::setfill(' ')      // character used to fill the column
          << std::setw(20)          // width of column
          << f << '\n';             // your number

Antwoord 5

Probeer setw manipulator te gebruiken. Raadpleeg http://www.cplusplus.com/reference/iostream/manipulators/setw/ voor meer informatie


Antwoord 6

Er is een manier om i/o-manipulatoren te gebruiken, maar ik vind het onpraktisch. Ik zou gewoon een functie als deze schrijven:

template<typename T>
std::string RightAligned(int size, const T & val)
{
    std::string x = boost::lexical_cast<std::string>(val);
    if (x.size() < size)
        x = std::string(size - x.size(), ' ') + x;
    return x;
}

Other episodes