<iomanip> 的对齐问题
Alignment problems with <iomanip>
所以我正在使用 iomanip
库来解决这个问题:
std::cout << std::endl
<< std::left << std::setw(15) << "Ticker Symbol"
<< std::setw(100) << "Stock Name"
<< std::setw(12) << "Value"
<< std::setw(10) << "Date"
<< std::setw(10) << "YTD Return"
<< std::endl;
问题是它最终打印了这个:
T icker SymbolS tock NameV alueD ateY TD Return
而不是:
Ticker Symbol Stock Name Value Date YTD Return
有没有一种方法可以在不使用其他库的情况下解决这个问题?
编辑:我的运算符重载函数似乎导致了这个问题:
std::ostream& operator<< (std::ostream& out, const char array[])
{
for (uint8_t i = 0; array[i] != '[=14=]'; i++)
{
out << array[i];
}
return out;
}
话虽如此,我仍然不知道如何解决这个问题。
为什么要重载运算符?这肯定是导致您出现问题的原因。
setw
将应用于输出到流的第一件事,并且因为您有 c 字符串一次输出一个字母,所以 setw
仅应用于第一个字母 -产生您所看到的行为。
最简单的方法就是摆脱运算符超载。否则你需要从 cout.width()
中获取宽度,一次输出一个字母,然后在后面添加额外的空格:
std::ostream& operator<< (std::ostream& out, const char array[])
{
int width = out.width();
out.width(0);
int array_size = 0;
for (uint8_t i = 0; array[i] != '[=10=]'; i++, array_size++)
{
out << array[i];
}
for (int i = array_size; i < width; i++)
{
out << " ";
}
return out;
}
所以我正在使用 iomanip
库来解决这个问题:
std::cout << std::endl
<< std::left << std::setw(15) << "Ticker Symbol"
<< std::setw(100) << "Stock Name"
<< std::setw(12) << "Value"
<< std::setw(10) << "Date"
<< std::setw(10) << "YTD Return"
<< std::endl;
问题是它最终打印了这个:
T icker SymbolS tock NameV alueD ateY TD Return
而不是:
Ticker Symbol Stock Name Value Date YTD Return
有没有一种方法可以在不使用其他库的情况下解决这个问题?
编辑:我的运算符重载函数似乎导致了这个问题:
std::ostream& operator<< (std::ostream& out, const char array[])
{
for (uint8_t i = 0; array[i] != '[=14=]'; i++)
{
out << array[i];
}
return out;
}
话虽如此,我仍然不知道如何解决这个问题。
为什么要重载运算符?这肯定是导致您出现问题的原因。
setw
将应用于输出到流的第一件事,并且因为您有 c 字符串一次输出一个字母,所以 setw
仅应用于第一个字母 -产生您所看到的行为。
最简单的方法就是摆脱运算符超载。否则你需要从 cout.width()
中获取宽度,一次输出一个字母,然后在后面添加额外的空格:
std::ostream& operator<< (std::ostream& out, const char array[])
{
int width = out.width();
out.width(0);
int array_size = 0;
for (uint8_t i = 0; array[i] != '[=10=]'; i++, array_size++)
{
out << array[i];
}
for (int i = array_size; i < width; i++)
{
out << " ";
}
return out;
}