在一个C++程序中,我有一些代码来打印一个名为分数的类的对象。它的变量是n(分子)、d(分母)和and (信号:当分数为正时为true,否则为false )。
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:
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。有办法改变这种状况吗?我真的需要对不同的分数使用不同的宽度。提前谢谢。
发布于 2015-05-16 12:31:18
这是因为,按照https://stackoverflow.com/a/1533752,输出的width对于每个格式化的输出都显式地重置。
您可以做的是在函数开始时获取当前宽度,即std::setw (或相关的)设置的宽度,然后对要应用它的每个值显式地设置此宽度,并对要输出的每个值使用std::setw(0)如下:
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;
}现在,您需要在此基础上进行一些改进,以处理左填充和右填充;这只处理左填充。
https://stackoverflow.com/questions/30275084
复制相似问题