C ++输出对齐和小数位数?

时间:2012-02-03 15:26:52

标签: c++ precision

嗨,我在这里得到一个小问题。
我正在做我的C ++作业,样本输出是

% cat this.out
  5.00       0.00 
  1.55       4.76 
 -4.05       2.94 
 -4.05      -2.94 
  1.55      -4.76 

但我得到的是

% cat test.out
    5       0
    1.55    4.76
    -4.05   2.94
    -4.05   -2.94
    1.55    -4.76

我无法弄清楚如何使我的输出格式看起来像那样。 在这种情况下我遇到的另一个问题是,我希望输出中的第一行类似于5.00 0.00,但即使我设置precision(3)

也不行

这是我的代码生成输出,请看一下。

file.open (filename, fstream :: in | fstream :: trunc);
    if(!file.is_open())
    {
            cerr << "Error opening file " << filename << endl;
            cout << "Exiting..." << endl;
            exit(0);
    }
    for(i = 0 ; i < num; i ++)
    {
            angle = 2 * M_PI * i/num;
            x = rad * cos(angle);
            y = rad * sin(angle);
            file.precision(3);
            // x, y are double
            file << "\t" << x << "\t" << y << endl;
    }
    cout << "finished";
    file.close();

3 个答案:

答案 0 :(得分:3)

您需要在标准库标题Input/output manipulators中查找<iomanip>

这些内联使用,如:

std::cout << "\t" << std::fixed << std::setprecision(z) << x

你最感兴趣的是:

答案 1 :(得分:2)

像往常一样,您需要为特定语义定义操纵器。 为了快速工作,我经常会使用以下内容:

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& format )
    {
        dest.setf( std::ios_base::fixed, std::ios_base::floatfield );
        dest.precision( myPrecision );
        dest.width( myWidth );
        return dest;
    }
};

(在我自己的代码中,我从保存格式的基类派生这些 state,并在完整表达式结束时恢复它。)

这是相当通用的。在实践中,您将使用名称创建多个 例如coordangle,用于指定您在逻辑上输出的内容。 但是,你明白了。有了这个,你就可以写下这样的东西:

std::cout << FFmt( 6, 2 ) << x << '\t' << FFmt( 6, 2 ) << y << std::endl;

答案 2 :(得分:1)

这应该可以解决问题:

file.precision(2);
file << fixed << "\t" << x << "\t" << y << endl;