在C++中以表格形式输出数据

12
4个回答

18

这里是iomanip拥有的一小部分示例:

#include <iostream>
#include <iomanip>

int main(int argc, char** argv) {
    std::cout << std::setw(20) << std::right << "Hi there!" << std::endl;
    std::cout << std::setw(20) << std::right << "shorter" << std::endl;
    return 0;
}

除此之外,您还可以做其他一些事情,比如设置浮点数的精度,更改在使用setw时用作填充的字符,以某种方式输出不是十进制的数字等等。

http://cplusplus.com/reference/iostream/manipulators/


9

我没有找到喜欢的东西,所以我自己做了一个。您可以在https://github.com/haarcuba/text-table上找到它。

以下是其输出的示例:

+------+------+----+
|      |Sex   | Age|
+------+------+----+
|Moses |male  |4556|
+------+------+----+
|Jesus |male  |2016|
+------+------+----+
|Debora|female|3001|
+------+------+----+
|Bob   |male  |  25|
+------+------+----+

8

您是否可以做类似于C#示例的非常相似的事情:

String.Format("|{0,5}|{1,5}|{2,5}|{3,5}|", arg0, arg1, arg2, arg3);

就像:

printf("|%5s|%5s|%5s|%5s|", arg0, arg1, arg2, arg3);

这里有一个我用来制作此内容的参考:http://www.cplusplus.com/reference/clibrary/cstdio/printf/


3
在表格输出方面,C语言的printf函数绝对比C++的I/O操作简单易用。 - David Hammen
@Walter 这绝对是问题所在 - 你可以通过填充来解决下溢问题,但要处理溢出,你需要所有的逻辑和策略来“合理地”进行包装。(从溢出回溯到最近的分隔符,针对边缘情况回退到非分隔符包装,然后再考虑每行的格式。)它本身是一个相对简单的问题,但如果你只是为了美观修饰无关项目,那么可能会比其价值更多的工作。 - John P

0

检查列值长度,并记住值的长度以进行格式化。

printf(" %-4s| %-10s| %-5s|\n", "ID", "NAME", "AGE");

看看MySQL shell界面是怎么设计的,这会给你一个很好的想法。


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