繁体   English   中英

C ++ ostream格式

[英]C++ ostream formatting

我想要一个C ++类Xyz ,如下所示:

Xyz mything("/tmp/x1");

int main(int argc, char **argv) {
    mything << "Hello world";
}

导致创建文件“ / tmp / x1”,然后执行以下操作

2013-12-04 12:01 ::你好世界

写给它。

我遇到的第一个问题是ostream对于每种可能在<<类型都有很多专门的方法。 第二个是如果我有

cout << "hello" << "world";

cout << "hello";

那么operator <<的实现被称为"hello"需要知道语句中是否有任何内容(我该如何有效地进行if(last_in_line_of_<<)类型的构造?)。 标准cout通过具有endl对象来实现此目的。

基本上,一旦定义了类,我想用一行创建一个全局日志对象,并使用ostream操作对其进行写入,以便将cout得到的字符串包裹在一个较大的字符串中。

由于varargs方法很痛苦,而且很多人似乎都建议不要这样做,所以我最终还是考虑采用这种方法。

在像Python和Ruby这样的脚本语言中,对象具有strto_s方法(或等效方法),并对其进行printformat以对其进行格式化,从而使"hello {} world".format(x)格式化一个参数,而"hello {} world".format(" ".join(x))在格式化为字符串后,使用空格加入列表,然后将其"hello {} world".format(" ".join(x))到结果字符串中。

我想知道什么是正确的C ++方法。

可以向Xyz提供流行为,使其成为操纵器并使用常规流功能:

原型为

std::ostream& logtime(std::ostream& s)
{
   /* write date and time to s */
   return s;
}

可以用作

std::cout << logtime << "text and other things" << std::endl;

如果将std :: cout替换为其他任何ostream (例如,类型为std::filestreamoutfile变量),则您将获得完全相同的效果,但使用的操纵器可以处理任何类型的输出流(不一定是文件)

std::ofstream outfile("file");
outfile << logtime << "text and whatever else" << std::endl;

要了解如何格式化输出 ,请参阅cplusplus.com上“ 标准C ++库”参考中的iomanip。

例如:

  • setfill-设置填充字符
  • setprecision-设置小数精度
  • setw-设置字段宽度

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM