C++17:第二列文本的对齐方式

问题描述 投票:0回答:1

我见过几个类似的问题,但没有找到任何能完全满足我需要的问题,其中大多数使用

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

我知道对齐/宽度语法,但还没有弄清楚如何使用它们来完成我想要的事情。,这就是为什么我在代码中省略了它们的任何使用(我尝试了几种不同的失败组合在实际代码中)

c++ formatting c++17 text-alignment fmt
1个回答
0
投票

为什么不在格式字符串中简单地按照您想要的方式对齐第二列?

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, "|----------"
)};

© www.soinside.com 2019 - 2024. All rights reserved.