Cpp/C++ 从右到左一行输出对齐

Cpp/C++ Output allingment in one line from right AND left

我需要将右边的整数和左边的字符串写成一行,并让它们正确排列(查看代码下方的输出)。

基本上我只需要一种方法来编写 table 仅使用 iostreamiomanip 并从右侧更改 allingment对于整数,对于字符串和后面。

其他提示也很感激:)

#include <iostream>
#include <iomanip>
using namespace std;

class foo
{
public:
    int i;
    std::string s;
    int j;
    foo(int i1,std::string s1,int j1) : i(i1), s(s1),j(j1) {};
};

int main()
{
    foo f1(1, "abc",50);
    foo f2(100, "abcde",60);

    cout << resetiosflags(ios::adjustfield);
    cout << setiosflags(ios::right);
    cout << setw(6) << "i" << setw(15) << "s" << setw(15) << "j"<<endl;

    cout << setw(8) << f1.i << setw(15) 
        << resetiosflags(ios::adjustfield) << setiosflags(ios::left) << f1.s <<setw(5)
        << resetiosflags(ios::adjustfield) << setiosflags(ios::right) << setw(15) << f1.j << endl;

    cout << setw(8) << f2.i << setw(15) 
        << resetiosflags(ios::adjustfield) << setiosflags(ios::left) << f2.s <<setw(5
        << resetiosflags(ios::adjustfield) << setiosflags(ios::right) << setw(15) << f2.j << endl;

    /*i              s              j
          1abc                         50
        100abcde                       60*/

    return 0;
}

这是输出:

        i              s              j
          1abc                         50
        100abcde                       60

这就是我需要的:

        i              s              j
          1             abc            50
        100             abcde          60

在同一行中使用 leftright 不是问题。看起来您遇到的问题是不允许 space 在第一个值之后。看起来 setw(5) 可能是为了那个,但是因为它之后没有打印任何东西所以没有效果。我使用 7 来匹配用于字符串宽度的 15 总数。

也许这样的事情会奏效?可能最好将幻数提取为常量,这样您就可以在一个地方轻松调整所有这些数。您也可以将其包装在 operator<< 中,以将所有格式代码包含在一个地方。

第一行标题向左偏移一个对我来说很奇怪,但它符合您的示例,并且在必要时很容易调整。

#include <iostream>
#include <iomanip>
using namespace std;

class foo
{
public:
    int i;
    std::string s;
    int j;
    foo(int i1, std::string s1, int j1) : i(i1), s(s1), j(j1)
    {};
};

int main()
{
    foo f1(1, "abc", 50);
    foo f2(100, "abcde", 60);

    cout 
        << right << setw(7) << "i" << setw(7) << ' '
        << left << setw(15) << "s"
        << right << "j"
        << endl;

    cout 
        << right << setw(8) <<  f1.i << setw(7) << ' '
        << left << setw(15) << f1.s
        << right << f1.j
        << endl;

    cout 
        << right << setw(8) << f2.i << setw(7) << ' '
        << left << setw(15) << f2.s
        << right << f2.j
        << endl;

    return 0;
}

输出:

      i       s              j
       1       abc            50
     100       abcde          60