C++ 格式化输出
Formatted output in C++
我正在使用 setw
和 setfill
函数,但我现在完全卡住了。这是我的代码:
char separator = ' ';
cout << "-" << setw(INET_ADDRSTRLEN*4 + INET6_ADDRSTRLEN) << setfill('-') << "\n";
cout << "| Name" << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| IPv4" << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| IPv6" << setw(INET6_ADDRSTRLEN) << setfill(separator);
cout << "| Netmask" << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| Broadcast" << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "|\n";
cout << "-" << setw(INET_ADDRSTRLEN*4 + INET6_ADDRSTRLEN) << setfill('-') << "\n";
while (iter != this->iface.end()) {
cout << "| " << (*iter).iface_name << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| " << (*iter).ipv4 << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| " << (*iter).ipv6 << setw(INET6_ADDRSTRLEN) << setfill(separator);
cout << "| " << (*iter).netmask << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| " << (*iter).broadcast << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "|\n";
iter++;
}
这是我的输出。如何修复列的对齐方式?
--------------------------------------------------------------------------------------------------------------
| Name | IPv4 | IPv6 | Netmask | Broadcast |
--------------------------------------------------------------------------------------------------------------
| lo | 127.0.0.1 | ::1 | 255.0.0.0 | 127.0.0.1 |
| eth0 | 192.168.1.100 | fe80::2ad2:44ff:fe39:f798 | 255.255.255.0 | 192.168.1.255 |
| wlan0 | 192.168.1.103 | fe80::e8b:fdff:fe7c:bf5 | 255.255.255.0 | 192.168.1.255 |
您想左对齐您的填充字段,推理起来会更简单(参见 std::left
):
std::cout << std::setw(INET_ADDRSTRLEN) << std::left << iter->iface_name
<< "| "
<< std::setw(INET_ADDRSTRLEN) << std::left << iter->ipv4
<< "| "
<< std::setw(INET6_ADDRSTRLEN) << std::left << iter->ipv6
// etc.
照原样,您的列不是基于您的字符串长度,而是基于它们后面的空格 - 从逻辑上讲,这不是恒定宽度。
我正在使用 setw
和 setfill
函数,但我现在完全卡住了。这是我的代码:
char separator = ' ';
cout << "-" << setw(INET_ADDRSTRLEN*4 + INET6_ADDRSTRLEN) << setfill('-') << "\n";
cout << "| Name" << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| IPv4" << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| IPv6" << setw(INET6_ADDRSTRLEN) << setfill(separator);
cout << "| Netmask" << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| Broadcast" << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "|\n";
cout << "-" << setw(INET_ADDRSTRLEN*4 + INET6_ADDRSTRLEN) << setfill('-') << "\n";
while (iter != this->iface.end()) {
cout << "| " << (*iter).iface_name << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| " << (*iter).ipv4 << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| " << (*iter).ipv6 << setw(INET6_ADDRSTRLEN) << setfill(separator);
cout << "| " << (*iter).netmask << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "| " << (*iter).broadcast << setw(INET_ADDRSTRLEN) << setfill(separator);
cout << "|\n";
iter++;
}
这是我的输出。如何修复列的对齐方式?
--------------------------------------------------------------------------------------------------------------
| Name | IPv4 | IPv6 | Netmask | Broadcast |
--------------------------------------------------------------------------------------------------------------
| lo | 127.0.0.1 | ::1 | 255.0.0.0 | 127.0.0.1 |
| eth0 | 192.168.1.100 | fe80::2ad2:44ff:fe39:f798 | 255.255.255.0 | 192.168.1.255 |
| wlan0 | 192.168.1.103 | fe80::e8b:fdff:fe7c:bf5 | 255.255.255.0 | 192.168.1.255 |
您想左对齐您的填充字段,推理起来会更简单(参见 std::left
):
std::cout << std::setw(INET_ADDRSTRLEN) << std::left << iter->iface_name
<< "| "
<< std::setw(INET_ADDRSTRLEN) << std::left << iter->ipv4
<< "| "
<< std::setw(INET6_ADDRSTRLEN) << std::left << iter->ipv6
// etc.
照原样,您的列不是基于您的字符串长度,而是基于它们后面的空格 - 从逻辑上讲,这不是恒定宽度。