Cpp/C++ 从右到左一行输出对齐
Cpp/C++ Output allingment in one line from right AND left
我需要将右边的整数和左边的字符串写成一行,并让它们正确排列(查看代码下方的输出)。
基本上我只需要一种方法来编写 table 仅使用 iostream 和 iomanip 并从右侧更改 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
在同一行中使用 left
和 right
不是问题。看起来您遇到的问题是不允许 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
我需要将右边的整数和左边的字符串写成一行,并让它们正确排列(查看代码下方的输出)。
基本上我只需要一种方法来编写 table 仅使用 iostream 和 iomanip 并从右侧更改 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
在同一行中使用 left
和 right
不是问题。看起来您遇到的问题是不允许 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