C++ 与<;iomanip>;

C++ 与<;iomanip>;,c++,visual-studio-2013,text-alignment,iomanip,C++,Visual Studio 2013,Text Alignment,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) <<

因此,我使用
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;
而不是:

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::ostream&operator为什么必须使运算符过载?这当然是造成你问题的原因

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;
}

std::ostream&operatorA黑暗中拍摄:在写入之间刷新流是否有帮助?放置
std::cout.flush()在此之前,代码不起任何作用。我无法在我的系统上复制它。你在用什么编译器?你能提供一个最小的、可重复的测试用例吗?这看起来像是编译器标准库中的一个bug。您使用的是哪个平台和编译器?
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;
}