簡體   English   中英

C - 使用 fprintf 和 time.h 時避免換行

[英]C - avoiding a newline when using fprintf with time.h

在將當前時間寫入 log.txt 文件,我不斷打印新行。 在此示例中,我希望將時間和 logMessage 打印在同一行上。 你能指出我在這里缺少什么的正確方向嗎?

從主function調用logWrite function:

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

logWrite function 是:

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**********

時間信息.h

ctime(3) - Linux 手冊頁說:

調用ctime(t)等效於asctime(localtime(t)) 它將日歷時間 t 轉換為形式為 null 的字符串
"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);

根據ctime的文檔,該字符串嵌入了換行符。 您需要將其從打印考慮中刪除。

由於ctime返回的字符串具有恆定寬度的指定格式,這應該實現:

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

(編輯:這是假設您首先希望使用ctime ,就像您在問題中所做的那樣。還有其他可能更好的選項,例如strftime 。)

ctime function 總是將'\n'添加到 string 的末尾 有很多不同的方法可以解決這個問題,但最簡單的方法是刪除這個符號。 例如,可以這樣做(基於ctime參見 man )返回char * ,而不是const char *的事實):

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

然后打印這一行:

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

PS 我不推薦使用這樣的記錄,因為字符串 AAA 可能包含例如 % 字符,它將被解釋為特殊字符。

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

PPS 以下三行

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

可以合並為一個

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM