C++ 如何对齐不同长度的输出C++;

C++ 如何对齐不同长度的输出C++;,c++,io,alignment,console-application,C++,Io,Alignment,Console Application,我已经试着搜索了很多关于这个的帖子,但我仍然无法找到答案。假设我有一个循环,它从文本文件中读取行,然后在屏幕上显示它们。我希望每个数据点都对齐,但问题是数据的长度可能不同,因此在setw中使用静态值是不起作用的。 例如,这里有一个文本文件 000000 apples pears 2.00 000001 oranges bannana 1.00 这就是我希望它在屏幕上的显示方式,但我的屏幕是这样的 000000 apples pears 2.

我已经试着搜索了很多关于这个的帖子,但我仍然无法找到答案。假设我有一个循环,它从文本文件中读取行,然后在屏幕上显示它们。我希望每个数据点都对齐,但问题是数据的长度可能不同,因此在setw中使用静态值是不起作用的。 例如,这里有一个文本文件

000000  apples      pears     2.00
000001  oranges     bannana   1.00
这就是我希望它在屏幕上的显示方式,但我的屏幕是这样的

000000  apples      pears     2.00
000001 oranges    banana   1.00
它看到桔子比苹果长1,然后它把它移到左边1。香蕉和梨也是一样

如何像第一个示例一样对齐它(这是它在文本文件中的外观)

这就是我正在使用的:

cout << account << setw(10) << fruit << setw(10) << fruit2 << setw(10) << money << endl;

cout如果您使用的是std::string,下面是我如何解决这个问题的:

cout << left << setw(10) << account << setw(10) << fruit << setw(10 + strlen(fruit2.c_str()) -  strlen(fruit.c_str())) << fruit2 << endl;   

这没有什么意义——如果你真的得到了这个结果,听起来你的编译器有问题。我写了一个很好的演示,类似于你在问题中所做的:

#include <iostream>
#include <iomanip>
#include <string>
#include <iterator>

struct account {
    std::string acct;
    std::string fruit;
    std::string fruit2;
    double qty;

    friend std::ostream &operator<<(std::ostream &os, account const &a) {
        return os << a.acct << std::setw(10) 
                << a.fruit << std::setw(10)
                << a.fruit2 << std::setw(5)
                << a.qty;
    }   
};

int main() { 
    account accts[] = {
        { "0000", "apples", "pears", 2.0 },
        { "0001", "oranges", "banana", 1.0 }
    };

    std::copy_n(accts, 2, std::ostream_iterator<account>(std::cout, "\n"));
}

每个项在其字段中都是右对齐的,正如您从规范中所期望的那样。

您只是缺少std::ios\u base::left标志

std::cout << std::setw(10) << std::setiosflags(std::ios_base::left)
      << "x" << "y" << std::endl;

<代码> STD::CUT考虑使用我不能使用Boost,因为它不能有额外的库,然后考虑使用<代码> Prtff。
0000    apples     pears    2
0001   oranges    banana    1
std::cout << std::setw(10) << std::setiosflags(std::ios_base::left)
      << "x" << "y" << std::endl;