我见过几个类似的问题,但没有找到任何能完全满足我需要的问题,其中大多数使用
std::cout
和 iomanip
我正在使用 libfmt (尽管 c++20 答案可能是兼容的)
我有类似以下的声明:
std::string{fmt::format(
"Found system paths:\n"
"{8}base: {0}\n"
"{8}share: {1}\n"
"{8}locale: {2}\n"
"{8}sysConf: {3}\n"
"{8}home: {4}\n"
"{8}config: {5}\n"
"{8}data: {6}\n"
"{8}cache: {7}\n",
base, share, locale, sysConf, home, conf, data, cache, "|----------"
)};
{8}
的目的是补偿fmt完成后添加到输出第一行的前缀。
问题是,由于实际路径和每个文件夹的名称都有不同的宽度,我无法让它整齐地对齐。
我想看到的是这样的:
----------- Found system paths
|---------- base: /path/to/somewhere/base
|---------- share: /path/to/base/share
|---------- locale: /path/to/base/locale
|---------- sysConf: /path/to/another-place/config
|---------- home: /path/to/home
|---------- config: /path/to/a-third-place/config
|---------- data: /path/to/base/data
|---------- cache: /path/to/a-third-place/cache
我知道对齐/宽度语法,但还没有弄清楚如何使用它们来完成我想要的事情。,这就是为什么我在代码中省略了它们的任何使用(我尝试了几种不同的失败组合在实际代码中)
为什么不在格式字符串中简单地按照您想要的方式对齐第二列?
std::string{fmt::format(
"Found system paths:\n"
"{8}base: {0}\n"
"{8}share: {1}\n"
"{8}locale: {2}\n"
"{8}sysConf: {3}\n"
"{8}home: {4}\n"
"{8}config: {5}\n"
"{8}data: {6}\n"
"{8}cache: {7}\n",
base, share, locale, sysConf, home, conf, data, cache, "|----------"
)};