Au moment où vous émettez la toute première ligne,
Artist Title Price Genre Disc Sale Tax Cash
pour atteindre « l'alignement », vous devez savoir « à l'avance » la largeur de chaque colonne devra être (sinon, l'alignement est impossible) . Une fois que vous connaissez la largeur nécessaire pour chaque colonne (il y a plusieurs façons d'y parvenir selon l'origine de vos données), la fonction setw
mentionnée dans l'autre réponse vous aidera, ou (plus brutalement ;-) pourrait émettre un nombre soigneusement calculé d'espaces supplémentaires (clunky, pour être sûr), etc. Je ne recommande pas les onglets de toute façon car vous n'avez aucun contrôle réel sur la façon dont le périphérique de sortie final les rendra, en général. Pour revenir au problème principal, par exemple, si vous avez une valeur de colonne dans un vector<T>
, vous pouvez par exemple effectuer une première passe de mise en forme pour déterminer la largeur maximale de la colonne (assurez-vous de prendre en compte compte aussi la largeur de l'en-tête de la colonne, bien sûr). Si vos lignes arrivent «une par une» et que l'alignement est crucial, vous devrez mettre en cache ou mettre en mémoire tampon les lignes à mesure qu'elles entrent (en mémoire si elles correspondent, sinon sur un fichier disque que vous aurez plus tard "rembobiner" et relire depuis le début), en prenant soin de garder à jour le vecteur des "largeurs maximales de chaque colonne" comme les lignes viennent. Vous ne pouvez rien sortir (pas même les en-têtes!), Si l'alignement est crucial, jusqu'à ce que vous ayez vu la toute dernière rangée (à moins que vous ayez magiquement connaissance des largeurs des colonnes, bien sûr ;-).
Les réponses ci-dessous permettent de spécifier la largeur d'une colonne. Notez que cela nécessite de connaître une limite supérieure (contrainte de base de données par exemple) ou de la calculer au préalable (ce qui peut signifier l'analyse de toute la structure avant de commencer à l'imprimer). La seconde, bien que nécessaire, est bien sûr plus lente :) –