我想避免在我的C ++代码中使用sprintf,所以我只能使用C ++中的std字符串,但我还没有找到替换它的方法。我目前使用sprintf格式化日期和时间,如下所示:
char myDate[DATE_LENGTH]{};
sprintf(myDate, "%4d-%02d-%02d %02d:%02d:%02d", year, month, day,
hour, minute, second);
这样,我将得到每个整数的固定长度,如果需要,前导零。
我已经搜索了如何用stringstream替换它,并发现了这个:
std::ostringstream ss;
ss << std::setw(5) << std::setfill('0') << 12 << "\n";
但这只会格式化其中一个整数。我需要为每个日期和tiem组件执行此操作,然后将所有这些组合在一起。因此,要替换一行C风格代码,我需要更多新代码。
没有办法比这更好吗?
答案 0 :(得分:2)
在C ++应用程序中使用snprintf()
或strftime()
时,没有不好。它们快速,可靠,并且是标准库的一部分。 IOStream有时候只是太冗长而无法直接使用它们。您始终可以将基于sprintf
的序列化程序包装到iostream
shell中。
在没有样板文件的情况下,在C ++ 11中格式化日期/时间的另一种方法是put_time。
答案 1 :(得分:2)
(1)定义自己的数据时间类。
(2)为其定义operator <<()
和operator >>()
。在这些功能中,使用std::time_put
和std::time_get
构面来实现。
(3)如果std::time_put
和std::time_get
无法满足您的需求,您可以通过继承它们来定义自己的time_put / get facet,并在必要时使用其他助手方面,例如date_time格式管理器
PS:如果您使用的是c ++ 11,则可能会满足std::time_put::put()
和std::time_get::get()
。
祝你好运!