C++流格式化输出都是一次性的吗?

a291936324 2011-04-02 07:56:39
我发现每一个cout用完之后,先前设置的格式都没有了。比如说:
cout.setf(ios::left);
cout.width(2);
cout << '*'<<'*'<<endl;
cout << '*'<<setw(2)<<'*';
cout <<'*'<<'*';
如果,我一个函数里面需要让对齐一直为左对齐,域宽一直为2.有没有办法一劳永逸?回头我在取消格式。如果有的话,讲详细一点了。谢啦。
...全文
136 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
a291936324 2011-04-03
  • 打赏
  • 举报
回复
好吧,我知道我的例子举得不好。
操纵符的作用时间貌似不同,看下面的代码:
for (int i =0; i != wide; ++i)
if (i == 0 || i == wide / 2 - 1 || i == wide - 1)
{
for ( int j = 0; j != wide; ++j)
cout << setw(2) << left << '*';
cout << endl;
}
else
cout << setw(wide - 1) << '*' << setw(wide - 1) << '*' << '*' << endl;

setw()设置域宽,一次只有后面一个有效,若要重复使用必须连续输入。
而left则不同,他是设置之后,就不会变了。

可是看MSDN上的解释:
The manipulator returns an object that, when extracted from or inserted into the stream str, calls str.width(_ Wide), then returns str. 然后在看了一下输出流类成员函数width的定义如下:
streamsize __CLR_OR_THIS_CALL width(streamsize _Newwidth)
{ // set width to argument
streamsize _Oldwidth = _Wide;
_Wide = _Newwidth;
return (_Oldwidth);
}

很明显。每次调用这个函数,都会让域宽_Wide等于Newwidth。然后返回先前的域宽_Oldwidth。
这样说来,如果不重新设定域宽的话cout << '*'每一次都会按照原先的域宽来输出。这就与本次实验的情形想矛盾了。
写这个的时候,我还在寻求原因。
这是我的实验报告中摘下来的。希望大家给点意见。最后一句我必须设置2次域宽。为毛。
a291936324 2011-04-03
  • 打赏
  • 举报
回复
额,你这怎么解?
定义了一个标记。。。?
[Quote=引用 5 楼 xujiezhige 的回复:]

你的左对齐函数用的不好,最后用第二个,将右对齐的标志位清除。

C/C++ code

ios_base::fmtflags fmt;
fmt=cout.setf(ios_base::right,ios_base::adjustfield);



宽度目前没有发现一劳永逸的设置方法,再不行,自己写函数也可以。

但是格式化都推荐时使用<iomanip>非常好用。就想你的cout<……
[/Quote]
雪人2015 2011-04-03
  • 打赏
  • 举报
回复

ios_base::fmtflags fmt;
fmt=cout.setf(ios_base::right,ios_base::adjustfield);


这是定义了一个位标记,先把cout的输出格式保存下来。以便以后恢复原来的格式。
恢复的时候用
cout.setf(fmt);

你上面说的没太明白,你是不是就是想设置宽度为2。是的话,现在就用一种就可以了:

每次输出都加上setw();

况且作为控制台输出不需要太高的效率。
雪人2015 2011-04-02
  • 打赏
  • 举报
回复
你的左对齐函数用的不好,最后用第二个,将右对齐的标志位清除。


ios_base::fmtflags fmt;
fmt=cout.setf(ios_base::right,ios_base::adjustfield);


宽度目前没有发现一劳永逸的设置方法,再不行,自己写函数也可以。

但是格式化都推荐时使用<iomanip>非常好用。就想你的cout<<setw(2)<<"...";
無_1024 2011-04-02
  • 打赏
  • 举报
回复
有的是 有的不是
a291936324 2011-04-02
  • 打赏
  • 举报
回复
并没有这个函数。只有cout.width()
[Quote=引用 2 楼 npuhuxl 的回复:]

cout.setw(2)
[/Quote]
npuhuxl 2011-04-02
  • 打赏
  • 举报
回复
cout.setw(2)
a291936324 2011-04-02
  • 打赏
  • 举报
回复
额,居然没有人回我。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧