在C++中格式化输出

lov*_*eed 15 c++ output-formatting

在C++代码中,我有一个双打变量矩阵,我打印出来.但是因为它们都具有不同的位数,所以输出格式被破坏.一种解决方案是做 cout.precision(5)但我希望不同的列具有不同的精度.此外,由于在某些情况下存在负值,因此-符号的存在也会引起问题.如何解决这个问题并生成格式正确的输出?

Jam*_*nze 16

正如其他人所说,关键在于使用机械手.他们忽略的是你通常使用自己编写的操纵器.一个FFmt机械手(对应于FFortran语言格式是相当容易:

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

这样,您可以为每列定义变量,例如:

FFmt col1( 8, 2 );
FFmt col2( 6, 3 );
//  ...
Run Code Online (Sandbox Code Playgroud)

和写:

std::cout  << col1 << value1
    << ' ' << col2 << value2...
Run Code Online (Sandbox Code Playgroud)

通常,除了最简单的程序之外,您可能不应该使用标准操纵器,而是使用基于应用程序的自定义操纵器; 例如temperature,pressure如果这是你处理的事情.通过这种方式,您可以在代码中清楚地了解您要格式化的内容,如果客户端突然要求压力增加一位数,您就会确切地知道在哪里进行更改.


sta*_*nri 15

在我的脑海中,你可以使用setw(int)来指定输出的宽度.

像这样:

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;
Run Code Online (Sandbox Code Playgroud)

给出这个:

    0.2    123456
   0.12 123456789
Run Code Online (Sandbox Code Playgroud)


Joh*_*ing 7

使用操纵器.

这里的样本:

#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';
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)