2015-11-09 2 views
0

Je suis en utilisant la bibliothèque iomanip à ce cout:problèmes d'alignement avec <iomanip>

std::cout << std::endl 
    << std::left << std::setw(15) << "Ticker Symbol" 
    << std::setw(100) << "Stock Name" 
    << std::setw(12) << "Value" 
    << std::setw(10) << "Date" 
    << std::setw(10) << "YTD Return" 
    << std::endl; 

Le problème est qu'il finit par imprimer ceci:

T  icker SymbolS      tock NameV  alueD  ateY TD Return 

Au lieu de:

Ticker Symbol Stock Name       Value Date YTD Return 

Y at-il un moyen que je peux résoudre ce problème sans utiliser une autre bibliothèque?

Edit: Ma fonction de surcharge de l'opérateur semble être la cause de ce problème:

std::ostream& operator<< (std::ostream& out, const char array[]) 
{ 
    for (uint8_t i = 0; array[i] != '\0'; i++) 
    { 
     out << array[i]; 
    } 
    return out; 
} 

Cela étant dit, je ne sais toujours pas comment résoudre ce problème.

+0

Un coup dans l'obscurité: ne chasse le flux entre les écritures d'aide? –

+0

Mettre 'std :: cout.flush();' avant que ce code ne fasse rien. – LarryK

+2

[Ne peut pas reproduire] (http://coliru.stacked-crooked.com/a/9f71dfe3af6aa51f) – NathanOliver

Répondre

0

Pourquoi devez-vous surcharger l'opérateur? C'est certainement ce qui cause votre problème.

setw va obtenir appliqué à la première sortie de chose au courant, et parce que vous avez c-strings sortie une lettre à la fois, la setw soit appliquée à la première lettre - produire le comportement que vous voyez.

La chose la plus simple à faire est de vous débarrasser de la surcharge de votre opérateur. Sinon, vous devez obtenir la largeur de cout.width(), sortie une lettre à la fois, puis ajouter dans les espaces supplémentaires après:

std::ostream& operator<< (std::ostream& out, const char array[]) 
{ 
    int width = out.width(); 
    out.width(0); 
    int array_size = 0; 
    for (uint8_t i = 0; array[i] != '\0'; i++, array_size++) 
    { 
     out << array[i]; 
    } 

    for (int i = array_size; i < width; i++) 
    { 
     out << " "; 
    } 

    return out; 
}