将cout格式对齐为表格的列

32
我相信这是关于格式的简单问题,但这就是我想要实现的:
我想使用cout将数据输出到屏幕上。我希望以表格形式输出。我的意思是列和行应该正确对齐。例如:
Test                 1
Test2                2
Iamlongverylongblah  2
Etc                  1

我只关心单独的一行,所以我现在要输出的行(无法工作)是

cout << var1 << "\t\t" << var2 << endl;

这会给我一个类似这样的东西:

Test                 1
Test2                  2
Iamlongverylongblah         2
Etc                  1
5个回答

57

setw

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

int main () {
  cout << setw(21) << left << "Test"    << 1 << endl;
  cout << setw(21) << left << "Test2"   << 2 << endl;
  cout << setw(21) << left << "Iamlongverylongblah"     << 2 << endl;
  cout << setw(21) << left << "Etc"     << 1 << endl;
  return 0;
}

你忘记添加"<< left"了。如果你想要左对齐的固定字段,这是必需的。 - Raymond Martineau
2
std::left在每次格式化输出时不会被重置,您只需要使用一次即可。(流的宽度被重置。) - Roger Pate

10

我建议使用Boost Format。可以像这样使用:

cout << format("%|1$30| %2%") % var1 % var2;

2
你需要找到第一列最长字符串的长度,然后你需要在一个字段中输出第一列的每个字符串,该字段的长度应与最长字符串的长度相同。这必须意味着在读取完每个字符串之前,你不能写任何东西。

有没有更简单的方法?使用setw或其他什么东西。 - BobS
1
有没有更简单的方法? 除非你能预测未来。使用setw或其他东西。 是的,setw是一种“在字段中输出第一列中的每个字符串,其长度为最长字符串的长度”的方法。 - Jay Mooney
1
我看过的大多数格式化输出都没有找到字段的最大尺寸,如果超出了合理的值,那就算了,但当它发生时,格式可能看起来有些奇怪。 - Greg Rogers

2

你可能想要使用 std::format

带有对齐语法 "{:<30} | {:<30}\n"。这使您可以使用特定宽度的对齐格式化文本。

要格式化表格,您需要将其附加到 std:string 表行,并使用对齐和宽度格式化元素,如下所示:

table_rows += format("{:<32} | {:<30}\n", str_col_1, str_col_2);

对于调试,一些填充字符可能会很方便,您可以像这样设置它们:format("{:*<32} | {:+<30}\n" ...

如果您确实需要使用动态宽度,则确定最长的 "str_col_1" 并将其用作格式化的另一个参数:

std::format("{:<{}}", "left aligned", 30);

例子:

#include <iostream>
#include <string>
#include <fmt/format.h>

int main()
{
    std::string table_rows;
    std::string str_col_1[] = {"Name", "Age", "Gender", "City"};
    std::string str_col_2[] = {"John", "25", "Male", "New York"};

    for (int i = 0; i < 4; i++) {
        table_rows += fmt::format("{:<10} | {:<15}\n", str_col_1[i], str_col_2[i]);
    }

    std::cout << table_rows << "\n";

    return 0;
}

输出:

Name       | John           
Age        | 25             
Gender     | Male           
City       | New York 

参考:

https://en.cppreference.com/w/cpp/utility/format/formatter https://fmt.dev/latest/syntax.html


-1

你可以用它来完成

string str = "somthing";
printf ("%10s",str);
printf ("%10s\n",str);
printf ("%10s",str);
printf ("%10s\n",str);

1
他肯定已经知道用“printf”可以做到。他特别要求使用“cout”。 - cesargastonec
3
你怎么知道他(原帖作者)知道什么?原帖作者从未说过他尝试过 printf,也没有表明他只想要基于 cout 的答案。 - FractalSpace
1
标题中有 cout,并且他们写道:“我想使用 cout 将数据输出到屏幕上”。 - John Neuhaus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接