【问题标题】:How to concatenate strings in the function m_stream in C++?如何在 C++ 中的函数 m_stream 中连接字符串?
【发布时间】:2011-10-11 09:17:18
【问题描述】:

我正在用 C++ 为我的程序编写一个记录器。

我有这段代码:

void Log::Write(char* logline)
{
    time_t rawtime;
    struct tm * timeinfo;
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    m_stream << asctime (timeinfo) << logline << endl;
}

这是一个日志

2011 年 10 月 11 日星期二 13:07:28

我想在一行上显示不同的输出,如下所示: 2011 年 10 月 11 日星期二 13:07:28 - 这是日志

我该怎么做? 谢谢!

【问题讨论】:

  • 我无法理解这一点。 logline 的值是多少?您的输出看起来与您的代码不一致。
  • 别担心只是写函数,logline是输入。
  • 你说的是颠倒日志的顺序和时间戳?
  • 对不起。我刚刚编辑了帖子。我想看看这个:2011 年 10 月 11 日星期二 13:07:28 - 这是一个日志,两行没有。

标签: c++ logging concatenation


【解决方案1】:

正如docs中所说:

asctime 生成的字符串结果正好包含 26 个字符,格式为 Wed Jan 02 02:03:55 1980\n\0

所以如果你不想写行结束符号,你可以使用'write'函数指定确切的字符数量,这样写

time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
m_stream.write( asctime (timeinfo), 24 );
m_stream << " - " << logline << std::endl;

当然在这种情况下你应该写注释解释为什么使用'24'...

【讨论】:

  • 我发现用 \0 替换最后一个 \n 的解决方案更优雅,并且不需要评论来解释你在做什么。
【解决方案2】:

你的问题是 asctime():

http://www.cplusplus.com/reference/clibrary/ctime/asctime/

The string is followed by a new-line character ('\n') and the terminating null-character.

由于返回的字符串是 C 字符串,您可以将 \n 替换为 \0:

char * str = asctime(timeinfo);
str[strlen(str) - 1] = '\0';

只要不再次调用 ctime 或 asctime,内容就不会被覆盖。

【讨论】:

    猜你喜欢
    • 2018-05-28
    • 2014-06-13
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多