相关疑难解决方法(0)

哪个iomanip操纵器"粘"?

我最近遇到了一个问题stringstream,因为我错误地认为std::setw()这会影响每次插入的字符串流,直到我明确地更改它.但是,插入后总是未设置.

// With timestruct with value of 'Oct 7 9:04 AM'
std::stringstream ss;
ss.fill('0'); ss.setf(ios::right, ios::adjustfield);
ss << setw(2) << timestruct.tm_mday;
ss << timestruct.tm_hour;
ss << timestruct.tm_min;
std::string filingTime = ss.str(); // BAD: '0794'
Run Code Online (Sandbox Code Playgroud)

所以,我有很多问题:

  • 为什么setw()这样?
  • 有这样的其他操纵者吗?
  • 是否有之间的行为差异std::ios_base::width()std::setw()
  • 最后有一个在线参考,清楚地记录了这种行为?我的供应商文档(MS Visual Studio 2005)似乎没有清楚地显示这一点.

c++ c++-faq

134
推荐指数
3
解决办法
3万
查看次数

打印cout <<时的C++对齐方式

使用打印时有没有办法对齐文字std::cout?我正在使用标签,但是当单词太大时,它们将不再对齐.

Sales Report for September 15, 2010
Artist  Title   Price   Genre   Disc    Sale    Tax Cash
Merle   Blue    12.99   Country 4%  12.47   1.01    13.48
Richard Music   8.49    Classical   8%  7.81    0.66    8.47
Paula   Shut    8.49    Classical   8%  7.81    0.72    8.49
Run Code Online (Sandbox Code Playgroud)

c++ cout stdout text-alignment

60
推荐指数
6
解决办法
10万
查看次数

当重载operator <<时,std :: endl是未知类型

我重载了运算符<<

template <Typename T>
UIStream& operator<<(const T);

UIStream my_stream;
my_stream << 10 << " heads";
Run Code Online (Sandbox Code Playgroud)

工作但是:

my_stream << endl;
Run Code Online (Sandbox Code Playgroud)

给出编译错误:

错误C2678:二进制'<<':找不到哪个运算符带有'UIStream'类型的左操作数(或者没有可接受的转换)

my_stream << endl工作的工作是什么?

c++ stl operator-overloading

58
推荐指数
4
解决办法
2万
查看次数

"永久"std :: setw

有没有办法永久设置std::setw操纵器(或其功能width)?看这个:

#include <iostream>
#include <iomanip>
#include <algorithm>
#include <iterator>

int main( void )
{
  int array[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256 };
  std::cout.fill( '0' );
  std::cout.flags( std::ios::hex );
  std::cout.width( 3 );

  std::copy( &array[0], &array[9], std::ostream_iterator<int>( std::cout, " " ) );

  std::cout << std::endl;

  for( int i = 0; i < 9; i++ )
  {
    std::cout.width( 3 );
    std::cout << array[i] << " ";
  }
  std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

跑完后,我看到:

001 …
Run Code Online (Sandbox Code Playgroud)

c++ templates setw

30
推荐指数
2
解决办法
1万
查看次数

有效使用C++ iomanip库

Vector用C++ 创建了一个类,它对我的​​问题非常有用.我现在正在清理它,我遇到了以下代码:

std::ostream& operator<<(std::ostream &output, const Vector &v){
  output<<"["
    <<std::setiosflags(std::ios::right | std::ios::scientific)
    <<std::setw(23)
    <<std::setprecision(16)
    <<v._x<<", "
    <<std::setiosflags(std::ios::right | std::ios::scientific)
    <<std::setw(23)
    <<std::setprecision(16)
    <<v._y<<", "
    <<std::setiosflags(std::ios::right | std::ios::scientific)
    <<std::setw(23)
    <<std::setprecision(16)
    <<v._z<<"]";
  return output;
} 
Run Code Online (Sandbox Code Playgroud)

该代码允许将矢量打印为std::cout<<v<<std::endl;.每个数字有23个空格,其中16个是小数.文本右对齐,以便打印:

 1.123456123456e+01
-1.123456123456e+01
Run Code Online (Sandbox Code Playgroud)

代替

1.123456123456e+01
-1.123456123456e+01
Run Code Online (Sandbox Code Playgroud)

代码似乎非常重复.你怎么能"存储"的格式(所有的setiosflags,setwsetprecision语句),这样你就会这样说:"这个给定的格式打印以标准方式中的字符,但数字".

谢谢!

编辑

根据Rob Adams的评论,我改变了我的丑陋代码(正如其他人所指出的那样,会让"下一个人"的精确度变得更加简洁(和正确)):

std::ostream& operator<<(std::ostream &output, const Vector &v){
  std::ios_base::fmtflags f = output.flags(std::ios::right | std::ios::scientific);
  std::streamsize p = output.precision(16);
  output<<"["
    <<std::setw(23)<<v._x<<", "
    <<std::setw(23)<<v._y<<", "
    <<std::setw(23)<<v._z
    <<"]";
  output.flags(f);
  output.precision(p);
  return output; …
Run Code Online (Sandbox Code Playgroud)

c++ iostream stream iomanip

7
推荐指数
1
解决办法
3282
查看次数

如何允许setw适用于以下所有标准输出?

应该是一个微不足道的问题,但发现setw仅适用于其紧接着的输出,并且不确定如何允许它应用于以下所有输出.

例如,对于以下代码行

cout<<setw(3)<<setfill('0')<<8<<" "<<9<<endl;
Run Code Online (Sandbox Code Playgroud)

要么

cout.width(3);
cout.fill('0');
cout<<8<<" "<<9<<endl;
Run Code Online (Sandbox Code Playgroud)

我希望输出008 009代替008 9

c++

5
推荐指数
1
解决办法
1776
查看次数