C ++ ostream格式化

时间:2013-12-05 21:29:53

标签: c++ formatting ostream

我希望得到一个C ++类Xyz,如下所示:

Xyz mything("/tmp/x1");

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

导致创建文件“/ tmp / x1”,以及

  

2013-12-04 12:01 :: Hello world

写给它。

我遇到的第一个问题是,ostream针对<<之后的每种类型都有许多专门的方法。第二个是如果我有

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

cout << "hello";

然后operator <<调用"hello"的实现需要知道语句中是否有任何内容(如何有效地执行if(last_in_line_of_<<)类型构造?)。 标准cout通过使用endl等对象来实现此目的。

基本上我想在定义类之后用一行创建一个全局日志对象,并用ostream操作写入它,这样就可以使用cout作为字符串get将被包裹在一个更大的字符串中。

我最终看到了这种做法,因为varargs方式很痛苦,很多人似乎都反对它。

在Python和Ruby等脚本语言中,对象有strto_s方法(或等效方法),printformat调用它们来格式化它们,以便"hello {} world".format(x)格式化一个参数,"hello {} world".format(" ".join(x))在格式化为字符串后使用空格连接列表,然后将其粘贴到结果字符串中。

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

2 个答案:

答案 0 :(得分:1)

Instad给予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 (如类型outfile的{​​{1}}变量)所取代,你会得到完全相同的效果,但是使用的是一个可以操作的操纵器使用任何类型的输出流(不一定是文件)

std::filestream

答案 1 :(得分:0)

要了解如何格式化输出,请参阅cplusplus.com iomanip中的Standard C++ Library reference

例如:

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