23 votes

Formatage de la sortie en C++

Dans un code C++, j'ai une matrice de variables doubles que j'imprime. Cependant, comme elles ont toutes un nombre différent de chiffres, le format de sortie est détruit. Une solution consiste à faire cout.precision(5) mais je veux que les différentes colonnes aient une précision différente. De plus, comme il y a des valeurs négatives dans certains cas, la présence de l'élément - pose également des problèmes. Comment contourner ce problème et produire une sortie correctement formatée ?

21voto

Stacey Points 1089

D'après ce que je sais, vous pouvez utiliser setw(int) pour spécifier la largeur de la sortie.

comme ça :

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;

donne ça :

    0.2    123456
   0.12 123456789

16voto

James Kanze Points 96599

La clé est, comme d'autres l'ont dit, d'utiliser des manipulateurs. Ce qu'ils ont Ce qu'ils ont négligé de dire, c'est que vous utilisez normalement des manipulateurs que vous écrivez vous-même. Un FFmt manipulateur (qui correspond à la F format en Fortran est assez facile :

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

De cette façon, vous pouvez définir une variable pour chaque colonne, par exemple :

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

et écrire :

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

En général, sauf dans les programmes les plus simples, vous ne devriez probablement pas être mais plutôt des manipulateurs personnalisés basés sur votre application. votre application ; par exemple temperature y pressure si c'est le genre de si c'est le genre de chose auquel vous avez affaire. De cette façon, il est clair dans le code ce que vous mettez en forme, et si le client demande soudainement un chiffre de plus dans le pression, vous savez exactement où effectuer la modification.

8voto

John Dibling Points 56814

Utilisez manipulateurs .

De l'échantillon aquí :

#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';
}

Salida:

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

3voto

jrok Points 30472

Jetez un coup d'œil au flux manipulateurs notamment std::setw y 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

0voto

Premkumar U Points 70

Essayez d'utiliser le manipulateur setw. Veuillez vous référer http://www.cplusplus.com/reference/iostream/manipulators/setw/ pour plus d'informations

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X