C++ ostream格式化

标签 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将被包裹在一个更大的字符串中。

varargs 以来,我一直在研究这种方法方法是痛苦的,许多人似乎反对它。

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

我想知道执行此操作的正确 C++ 方法是什么。

最佳答案

代替给 Xyz 一个流行为,让它成为一个操纵器并使用普通的流工具:

函数原型(prototype)为

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::filestream 类型的 outfile 变量),你会得到这种效果,但使用可以处理任何类型的输出流(不一定是文件)的操纵器

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

关于C++ ostream格式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20411134/

相关文章:

c++ - 在 .cpp 中定义常量 int/char*

c++ - xcode 包含路径冲突

c++ - 如何将 Bstr 转换为 Platform::String?

c++ - vim c++ 模板编写

java - HH 中的 JTextField 时间 :mm:ss

c++ - 将时间戳打印到 ostream 的最简单方法

c++ - C++ ostream (tostring) 的最佳实践

excel - 如何从具有多种颜色文本的单元格中根据字体颜色提取文本

xcode4 - XCode 4 注释格式(换行)

c++ - 单例日志类中运算符 << 的问题