【问题标题】:How does std::setw work with string output?std::setw 如何处理字符串输出?
【发布时间】:2017-02-15 06:33:57
【问题描述】:

我正在尝试使用 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;

我做错了什么??

【问题讨论】:

  • 尝试在小于五个字符的字符串上使用它("second" 是六个字符长)。请注意,...&lt;&lt; setw(5) &lt;&lt; 123456 &lt;&lt;... 也不会“工作”。
  • “我无法让它工作。” - 如果我们都知道(a)您对“工作”的定义是什么,以及(b)实际发生了什么以及它与(a)有何不同,也许您的问题会更有意义。您是否希望输出中有某种 truncation ?如果是这样,您的问题应该说明这一点。
  • @Someprogrammerdude 谢谢!!如果我需要firstsecond 之间的空格,为什么它需要six chars long ,所以它与空间无关。
  • @WhozCraig 谢谢,实际上我在firstsecond 之间没有任何空格。
  • 让我换种说法:把你希望得到和你实际得到的例子放在输出在你的问题中。我怀疑问题是您根本不了解std::setw 操纵器的功能。

标签: c++ string setw


【解决方案1】:

我怀疑您对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 值,因此每个输出的 total 行大小是相同的。所改变的只是应用填充的位置以及在std::setw 规范内对齐的输出。

【讨论】:

猜你喜欢
  • 2021-12-02
  • 2023-03-28
  • 2017-07-20
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
相关资源
最近更新 更多