2016-09-27 176 views
1

我需要在控制檯上打印一些數據。我的代碼是:C++ setw()不按預期方式工作

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代碼部分,但似乎無法找到問題。據我所知,這不是因爲控制檯總寬度,因爲第一行打印得很好。

回答

4

setw()按設計工作。它將輸出填充到給定數量的字節

問題是你不需要字節數,你需要文本寬度,但除非你的文本是純粹的ASCII和打印等寬字體,這兩件事情是不同的。

的差異發生在幾個級別:

  1. Unicode代碼點以上ASCII範圍進行編碼(假定UTF-8;它看起來像輸出爲UTF-8從不同的字節數行正在)作爲多個字節。
  2. 多個代碼點可以組合成單個字形。如果您使用的是除MacOS文件系統外的標準格式,所有西里爾字形都是單一的代碼點,但是以分解形式,「й」將是兩個。
  3. 字形可能需要不同的屏幕寬度。

第一點是什麼導致您的錯位,如果分解的字符可能出現在您的輸入中,可能與第二點相結合。只要你使用等寬字體輸出,第三個不是西里爾文的問題,但是如果你有可能遇到一些中文/日文/韓文文本,請記住它們的字形大多是「全角」,而那些在大多數終端上佔用兩個拉丁字母或西裏爾字母的空間。

C++標準庫不支持計算字形。你需要使用一個unicode支持庫(如ICU),並自己處理對齊—,或者採取簡單的方法,使文本列成爲最後一個,所以它的結束並不重要。


operator<<(std::ostream&, std::string const&)該文檔描述的width()效果的std::string::size()術語,這是絕對字節。