c++ iomanip表格格式

ubby3x7f  于 2023-03-14  发布在  其他
关注(0)|答案(2)|浏览(175)

我在iomanip上遇到了麻烦。我认为一个简化的代码可以比语言更好地解释一切。

#include <iostream>
#include <iomanip>
#include <string>

struct Dog {
  std::string name;
  int age;
};

std::ostream& operator<<(std::ostream& os, Dog dog) {
  return os << dog.name << ", " << dog.age << "yo";
}

int main() {
  Dog dog;
  dog.name = "linus";
  dog.age = 10;

  std::cout
    << std::left << std::setw(20) << std::setfill(' ') << "INFO"
    << std::left << std::setw(20) << std::setfill(' ') << "AVAILABLE" << std::endl;

  std::cout
    << std::left << std::setw(20) << std::setfill(' ') << dog
    << std::left << std::setw(20) << std::setfill(' ') << "yes";

  std::cin.get();
}

我想打印一个格式很好的表格,但是我的输出对齐不好,简单地说,当我cout我的狗,setwsetfill只在www.example.com上工作dog.name(由于operator<<的性质),结果如下

INFO                AVAILABLE
linus               , 10yoyes

代替

INFO                AVAILABLE
linus, 10 yo        yes

显然,我可以修改operator<<,只在os上附加一个string,但在真实的情况中,我必须更改大量复杂的定义(我宁愿避免这样的更改!:D)
你知道吗?

xzv2uavs

xzv2uavs1#

setw操作器设置 next 输出的字段宽度,在本例中是dog.name。如果你想直接在重载函数中使用流,确实没有办法绕过它。

unftdfkk

unftdfkk2#

试试看

std::ostream& operator<<(std::ostream& os, Dog dog) {
  std::string output = 
      dog.name + std::string(", ") + std::to_string(dog.age) 
      + std::string("yo");
  return os << output;
}

相关问题