首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有类对象的iomanip

具有类对象的iomanip
EN

Stack Overflow用户
提问于 2015-05-16 11:28:48
回答 1查看 205关注 0票数 6

在一个C++程序中,我有一些代码来打印一个名为分数的类的对象。它的变量是n(分子)、d(分母)和and (信号:当分数为正时为true,否则为false )。

代码语言:javascript
复制
ostream &operator << (ostream &os, const fraction &x){//n=0

    if(!x.sinal)
        os << "-";

    os << x.n;

    if(x.d!=1 && x.n!=0)
        os << "/" << x.d;

    return os;
}

它做得很好,但是当我尝试在其中使用setw()时,它不能正常工作:它只影响要打印的第一项(无论是信号还是分子)。

我试图更改它,找到的解决方案是首先将其转换为字符串,然后使用带有iomanip的os:

代码语言:javascript
复制
ostream &operator << (ostream &os, const fraction &x){//n=0

    string xd, xn;

    stringstream ssn;
    ssn << x.n;
    ssn >> xn;

    stringstream ssd;
    ssd << x.d;
    ssd >> xd;

    string sfra = "";

    if(!x.sinal)
        sfra += "-";

    sfra += xn;

    if(x.d !=1 && x.n != 0){
        sfra += "/";
        sfra += xd;
    }

    os << setw (7) << left << sfra;

    return os;
}

这是可行的,但很明显,我不能改变一个分数的宽度:对于所有的部分,它都是7。有办法改变这种状况吗?我真的需要对不同的分数使用不同的宽度。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-16 12:31:18

这是因为,按照https://stackoverflow.com/a/1533752,输出的width对于每个格式化的输出都显式地重置。

您可以做的是在函数开始时获取当前宽度,即std::setw (或相关的)设置的宽度,然后对要应用它的每个值显式地设置此宽度,并对要输出的每个值使用std::setw(0)如下:

代码语言:javascript
复制
ostream &operator << (ostream &os, const fraction &x)
{
    std::streamsize width = os.width();

    if(!x.sinal)
        os << std::setw(width) << "-";
    else
        os << std::setw(width); // Not necessary, but for explicitness.

    os << x.n;

    if(x.d!=1 && x.n!=0)
        os << "/" << std::setw(width) << x.d;

    return os;
}

现在,您需要在此基础上进行一些改进,以处理左填充和右填充;这只处理左填充。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30275084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档