我需要在控制台中打印一些数据。我的代码是:
cout << setw(5) << left << "id" << " | " << setw(10) << left << "computer" << " | " << setw(11) << left << "subsystem" << " | " <<
setw(8) << left << "number" << " | " << setw(80) << left << "name" << " | " << setw(13) << left << "config_file" << endl;
for (int i = 0; i < rows; i++)
{
cout << setw(5) << left << subsystem_table_data[i].id << " | " << setw(10) << left << subsystem_table_data[i].computer << " | " <<
setw(11) << left << subsystem_table_data[i].subsystem << " | " << setw(8) << left << subsystem_table_data[i].number << " | " <<
setw(80) << left << subsystem_table_data[i].name << " | " << setw(13) << left << subsystem_table_data[i].config_file << endl;
}
输出(向右滚动查看):
id | computer | subsystem | number | name | config_file
1 | 1 | 2 | 0 | Computer 1 - Общая компьютерная платформа - 1 | 1
2 | 1 | 1 | 0 | Computer 1 - Launcher - 1 | 2
3 | 1 | 23 | 0 | Computer 1 - Дисплей - 1 | 3
4 | 1 | 11 | 0 | Computer 1 - Контроллер цифровой - 1 | 4
5 | 1 | 21 | 0 | Computer 1 - Отладки - 1 | 5
6 | 2 | 2 | 0 | Computer 2 - Общая компьютерная платформа - 1 | 6
7 | 2 | 1 | 0 | Computer 2 - Launcher - 1 | 7
8 | 2 | 23 | 0 | Computer 2 - Дисплей - 1 | 8
预期输出(再次在右侧):
id | computer | subsystem | number | name | config_file
1 | 1 | 2 | 0 | Computer 1 - Общая компьютерная платформа - 1 | 1
2 | 1 | 1 | 0 | Computer 1 - Launcher - 1 | 2
3 | 1 | 23 | 0 | Computer 1 - Дисплей - 1 | 3
4 | 1 | 11 | 0 | Computer 1 - Контроллер цифровой - 1 | 4
5 | 1 | 21 | 0 | Computer 1 - Отладки - 1 | 5
6 | 2 | 2 | 0 | Computer 2 - Общая компьютерная платформа - 1 | 6
7 | 2 | 1 | 0 | Computer 2 - Launcher - 1 | 7
8 | 2 | 23 | 0 | Computer 2 - Дисплей - 1 | 8
我建议setw(80) << left << subsystem_table_data[i].name
代码部分出现问题,但似乎无法找到问题。据我所知,这不是因为总的控制台宽度,因为第一行打印得很好。
答案 0 :(得分:4)
setw()
按设计工作。它将输出填充到给定数量的字节 1 。
问题是你不需要字节数,你需要文本宽度,但除非你的文本是纯ASCII并且用等宽字体打印,否则这两件事情是不同的。
差异发生在几个层面:
第一点是导致错位的原因,如果输入中出现分解的字符,可能会与第二点结合。只要您使用等宽字体输出,第三个不是西里尔语的问题,但如果您有可能遇到一些中文/日文/韩文文本,请记住它们的字形大多是“全宽”并且那些在大多数航站楼上都有两个拉丁文或西里尔字母的空间。
C ++标准库不支持计算字形。你需要使用unicode支持库(比如ICU)并自己处理对齐 - 或者采取简单的方法,使文本列成为最后一个,所以它的结束无关紧要。
1 operator<<(std::ostream&, std::string const&)的文档描述了width()
对std::string::size()
的影响,这绝对是字节。