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 ?
Réponses
Trop de publicités?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.
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
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
Essayez d'utiliser le manipulateur setw. Veuillez vous référer http://www.cplusplus.com/reference/iostream/manipulators/setw/ pour plus d'informations
- Réponses précédentes
- Plus de réponses