2016-09-27 8 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でモノスペースフォントで印刷されていない限り、これらの2つの点は異なります。

違いがいくつかのレベルで起こる:ASCII範囲を超える

  1. UnicodeコードポイントはUTF-8を仮定し(符号化され、出力は、様々なバイト数からUTF-8にあるように見えます行が取っています)。
  2. 複数のコードポイントが1つのグリフに結合されることがあります。 MacOSファイルシステム以外の標準である合成標準形式を使用している場合、すべてのキリル文字は単一のコードポイントですが、分解された形式では '©'が2になります。
  3. グリフの画面幅が異なる場合があります。

最初の点は、ミスアラインメントの原因となります。分解された文字が入力に表示される可能性があります。モノスペースフォントを使用して出力する限り、3番目の文字はキリル文字の心配ではありませんが、中国語/日本語/韓国語のテキストを走らせる可能性がある場合、グリフはほとんど「全幅」です。それらはほとんどの端末で2つのラテン語またはキリル文字のスペースを取る。

C++標準ライブラリでは、グリフの数をカウントできません。ユニコードサポートライブラリ(ICUなど)を使用し、アライメントを自分で処理する必要があります。—または簡単な方法でテキスト列を最後にする必要があります。


operator<<(std::ostream&, std::string const&)のドキュメントには、std::string::size()の期間にwidth()の効果を説明し、それは間違いなくバイトです。

関連する問題