2013-03-18 27 views
0

我在我的C程序中有一個日誌文件,我試圖在每次用戶執行查詢時都進行輸入。它的工作原理除了將日期和時間打印到一行以及將活動字符串打印到下面的行之外。我需要它將整個條目打印到一行。我嘗試了一切,不明白爲什麼它不起作用。我認爲這與time_string有關。請有人可以幫忙嗎?代碼如下所示;如何在C中的文件中打印當前日期和時間以及字符串爲一行?

/* 
* This function writes a log to the log file. 
*/ 
void write_log(char *activity) { 
    FILE *lf; 
    time_t current_time; 
    char *time_string; 

    current_time = time(NULL); 
    time_string = ctime(&current_time); 
    strcat(time_string, activity); 
    lf = fopen("logs.txt", "a+"); 
    fprintf(lf, "%s\n", activity); 
    fclose(lf); 
} 

該函數在主函數中被調用並被傳遞給活動的字符串文字。

+0

通過「不工作」,你的意思是它崩潰了嗎?如果情況並非如此,你會得到什麼輸出? **編輯:**沒關係。 – 2013-03-18 17:08:12

回答

4

man ctime

呼叫ctime(t)相當於asctime(localtime(t))。 它日曆時間t轉換成以下形式的空終止字符串 「星期三6月30日21時49分08秒1993 \ n」個

所以\n字符被包括在生成的字符串英寸您必須刪除新行字符:

char* nl = strrchr(time_string, '\n'); 
if (nl) *nl = '\0'; 

另外值得注意的,從相同的鏈接參考頁:

返回值指向可能的後續調用任何被覆蓋靜態分配的字符串的日期和時間函數。

這是很重要的原因說明它是未知如何大,緩衝區所以使用它作爲一個strcat()目標,由於可能的緩衝區溢出是不安全的。而不是執行strcat()刪除新行字符並執行兩次寫入該文件;一個用於time_string,另一個用於activity\n

+0

謝謝,我該如何刪除新行字符? – 2013-03-18 17:18:53

+0

您可以使用'strrchr()'找到它,並將它設置爲'NULL'。 – hmjd 2013-03-18 17:19:45

+0

好的非常感謝你:) – 2013-03-18 17:26:47

1

ctime返回的字符串以換行符結束。見ctime(3)

另外,您正試圖修改由C庫使用的靜態緩衝區ctime返回的字符串。這可能會導致緩衝區溢出。

1

如何

fprintf(lf, "%.*s %s\n", strlen(time_string) - 1, time_string, activity); 

%.*s將將刪除TIME_STRING的後換行,因爲指定的精度是字符串長度 - 1

0
void write_log(char *activity) 
{ 

    FILE *lf; 
    time_t current_time; 
    char *time_string; 
    int length = 0; 
    char *line = NULL; 

    current_time = time(NULL); 
    time_string = ctime(&current_time); 
    length = strlen(time_string) + strlen(activity) + 1; 
    line = (char *)malloc(length); 
    if(line){ 
     memset(line,'\0',length); 
     strncpy(line,time_string, strlen(time_string)-1); 
     strcat(line," "); 
     strcat(line,activity); 
     lf = fopen("logs1.txt", "a+"); 
     fprintf(lf, "%s\n", line); 
     fclose(lf); 
     free(line); 
    } 
} 
相關問題