3

我正在尝试使用 set widthsetw将字符串输出到输出文件,但是,我无法使其工作。我有以下示例。

// 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;
}

编辑: 有了上面的行,我希望在firstand之间有很多空格second,比如 first second

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

注意:对于整数,它可以正常工作:

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

我做错了什么???

4

1 回答 1

8

我怀疑您的理解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规范的输出。

于 2017-02-15T07:30:43.980 回答