std :: setw如何使用字符串输出?

时间:2017-02-15 06:33:58

标签: c++ string setw

我正在尝试将字符串输出的set width setw用于输出文件,但是,我无法使其工作。我跟我有以下例子。

// setw example
#include <iostream>     
#include <iomanip>      
#include <fstream>

int main () {
    std::ofstream output_file;
    output_file.open("file.txt");
    output_file << "first" <<std::setw(5)<< "second"<< std::endl;
    output_file.close();
  return 0;
}

修改  通过以上几行,我预计firstsecond之间会有很多空格 first second

我几乎看不到任何空格,输出就像firstsecond 我想我错过了setw()

的工作

注意:对于整数,它只能正常工作:

output_file << 1 <<std::setw(5)<< 2 << std::endl;

我做错了什么?。

1 个答案:

答案 0 :(得分:6)

我怀疑你对std::setw的理解是不正确的。我认为你需要更多的东西:

您的代码中发生了什么:

  • 使用std::setw(5)建立五个字符的字段宽度。
  • "first"发送到流,长度为五个字符,因此已建立的字段宽度已完全消耗。没有额外的填充。
  • "second"发送到流中,该字符串长度为六个字符,因此,整个字段宽度将被消耗(实际上已被破坏)。再次,没有填充

如果您的意图是这样的(上面的列号显示位置):

 col: 0123456789012345678901234567890123456789
      first     second    third     fourth

注意每个单词如何在10个边界的偶数倍上开始。一种方法是使用:

  • 输出位置std::left(因此填充,如果有任何在右侧以达到所需的宽度)。这是字符串的默认值,但它确实没有伤害。
  • 填充字符std::setfill(' ')。再次,默认。
  • 字段宽度std::setw(10)为什么这么大?见下文

示例

#include <iostream>
#include <iomanip>

int main ()
{
    std::cout << std::left << std::setfill(' ')
              << std::setw(10) << "first"
              << std::setw(10) << "second"
              << std::setw(10) << "third"
              << std::setw(10) << "fourth" << '\n';
    return 0;
}

输出(已添加列数)

0123456789012345678901234567890123456789
first     second    third     fourth

那么如果我们将输出位置更改为std::right会发生什么?好吧,使用相同的程序,只将第一行更改为:

std::cout << std::right << std::setfill(' ')

我们得到了

0123456789012345678901234567890123456789
     first    second     third    fourth

最后,通过简单地将填充字符更改为可见的东西(即除了空格之外的东西),可以通过一种建设性的方式来查看填充字符的应用位置。最后两个示例输出,将填充字符更改为std::setfill('*')会产生以下输出:

第一

first*****second****third*****fourth****

第二

*****first****second*****third****fourth    

请注意,在这两种情况下,由于没有任何单个输出项违反std::setw值,因此每个输出行的输出行大小相同。所有改变都是应用填充的地方,输出在std::setw规范中对齐。