我正在尝试将字符串输出的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;
}
修改
通过以上几行,我预计first
和second
之间会有很多空格
first second
我几乎看不到任何空格,输出就像firstsecond
我想我错过了setw()
注意:对于整数,它只能正常工作:
output_file << 1 <<std::setw(5)<< 2 << std::endl;
我做错了什么?。
答案 0 :(得分:6)
我怀疑你对std::setw
的理解是不正确的。我认为你需要更多的东西:
std::setw
用于设置字段宽度std::setfill
用于设置填充字符std::left
, std::right
, std::internal
用于在指定的字段宽度中设置写入位置。您的代码中发生了什么:
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
规范中对齐。