将 fprintf 与 time.h 一起使用时避免换行

Avoiding a newline when using fprintf with time.h

在 当前时间写入 log.txt 文件后,我不断打印新行 。在此示例中,我希望将时间和日志消息打印在同一行上。你能指出我在这里遗漏的正确方向吗?

从主函数调用logWrite函数:

strcpy(logMessage, "**********RESTART**********");
logWrite(logMessagePtr);

logWrite函数是:

void logWrite(char * logMessagePtr)
{
    /* Initialise time variables for log file. */
    int hours, minutes, seconds, day, month, year;
    // time_t is an arithmetic time type
    time_t now;
    // Update current time using time(&now);
    time(&now);

    FILE * logFilePtr;

    logFilePtr = fopen ("C:\log.txt", "a");
    if (logFilePtr != NULL)
    {
        fprintf(logFilePtr, ("%s", ctime(&now)));
        fprintf(logFilePtr, "%s", logMessagePtr);
        fprintf(logFilePtr,"\n");
        fclose(logFilePtr);
        printf("Log file found\n"); //debug
    }
    else
    {
        perror("log.txt");
    }
}

log.txt 文件已成功(创建)附加到,但在将时间写入文件后,我总是得到一个新的换行符。

例如,当我连续两次 运行 程序时,log.txt 显示:

Sat May 22 09:16:47 2021
**********RESTART**********
Sat May 22 09:16:48 2021
**********RESTART**********

想要的是:

Sat May 22 09:16:47 2021 **********RESTART**********
Sat May 22 09:16:48 2021 **********RESTART**********

关于 time.h

的信息

根据 ctime 的文档,该字符串嵌入了换行符。您需要将其从打印考虑中删除。

由于 ctime 返回的字符串具有固定宽度的指定格式,因此应该实现:

fprintf(logFilePtr, "%.24s ", ctime(&now));

(编辑:这是假设您首先希望使用 ctime,就像您在问题中所做的那样。还有其他可能更好的选项,例如 strftime。)

The ctime function always adds '\n' to the end of string. There are many different ways to solve the problem, but the easiest way is to remove this symbol. This can be done, for example, like this (based on the fact that the ctime (see man) returns char *, 不是 const char *):

#include <string.h>
...
char *ctime_line = ctime (&now);
ctime_line[strlen (ctime_line) - 1] = '[=10=]';

然后打印这一行:

fprintf (logFilePtr, "%s", ctime_line);

P.S。我不建议使用这样的记录,因为字符串 AAA 可能包含例如 % 字符,它将被解释为特殊字符。

// bad
fprintf (logFilePtr, logMessagePtr);
// good
fprintf (logFilePtr, "%s", logMessagePtr);

P.P.S。下面三行

fprintf (logFilePtr, "%s", ctime (&now));
fprintf (logFilePtr, "%s", logMessagePtr);
fprintf (logFilePtr, "\n");

可以合二为一

fprintf (logFilePtr, "%s %s\n", ctime (&now), logMessagePtr);

ctime(3) - Linux man page 说:

The call ctime(t) is equivalent to asctime(localtime(t)). It converts the calendar time t into a null-terminated string of the form
"Wed Jun 30 21:49:08 1993\n"

ctime() 的规范中似乎包含添加换行符。您应该使用 strftime() 手动格式化日期和时间而不换行。

char date[128];
strftime(date, sizeof(date), "%a %b %d %T %Y", localtime(&now));
fprintf(logFilePtr, "%s", date);