【问题标题】:Alignment problems with <iomanip><iomanip> 的对齐问题
【发布时间】:2016-02-10 13:18:17
【问题描述】:

所以我使用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] != '\0'; i++)
    {
        out << array[i];
    }
    return out;
}

话虽如此,我仍然不知道如何解决这个问题。

【问题讨论】:

  • 黑暗中的一枪:在写入之间刷新流有帮助吗?
  • std::cout.flush(); 放在该代码之前没有任何作用。
  • 我无法在我的系统上重现它。你用的是什么编译器?你能提供一个最小的、可重现的测试用例吗?
  • 这看起来像是编译器标准库中的错误。您使用的是哪个平台和编译器?

标签: c++ visual-studio-2013 text-alignment iomanip


【解决方案1】:

为什么一定要重载操作符?这肯定是导致您的问题的原因。

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] != '\0'; i++, array_size++)
    {
        out << array[i];
    }

    for (int i = array_size; i < width; i++)
    {
        out << " ";
    }

    return out;
}

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2012-11-06
    • 2011-05-16
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多