2009-09-15 42 views
2

我想在「log」目錄下創建一系列文件,每個文件根據執行時間命名。在這些文件中,我想爲我的程序存儲一些日誌信息,例如行爲的函數原型等。 我通常使用的FOPEN硬盤的方式(「登錄/ ***」,「A」),這是不是這個purpose.And我只寫一個時間戳功能:如何創建以當前時間命名的文件?

char* timeStamp(char* txt){ 
    char* rc; 
    char timestamp[16]; 
    time_t rawtime = time(0); 
    tm *now = localtime(&rawtime); 

    if(rawtime != -1) { 
    strftime(timestamp,16,"%y%m%d_%H%M%S",now); 
    rc = strcat(txt,timestamp); 
    } 
    return(rc); 
} 

但我不知道接下來做什麼。請在這件事上給予我幫助!

+8

C和C++將爲您提供根本不同的答案... – GManNickG 2009-09-15 05:23:04

+0

+1給GMan。我給了你一個C的答案(沒有代碼,對不起 - 這是你的工作),但如果你想要一個C++的答案,不要標記C(反之亦然)。他們是兩種不同的語言。僅僅因爲一個是另一個(大部分)嚴格的超集,並不意味着你應該把它們合併爲一個整體。 – 2009-09-15 05:25:31

+0

對不起,我只是想解決這個問題,無意指定語言。 – iBacchus 2009-09-15 05:32:01

回答

3

聲明一個char陣列大到足以容納16 + "log/"(所以20個字符),並把它初始化爲"log/"然後用strcat()或什麼要補充的通過你的函數返回到您的數組的結束時間字符串相關。你去了!

注意字符串加法的工作原理:您的char數組是16個字符,這意味着您可以輸入15個字符加上一個空字節。重要的是不要忘記這一點。如果您需要16個字符的字符串,則需要將其聲明爲char timestamp[17]。請注意,"log/"是一個4個字符的字符串,因此它佔用5個字符(一個用於最後的nul字節),但strcat()將覆蓋,最後的nul字節從開始,所以您將最終以右數。不要數兩次終結者,但更重要的是,不要忘記它。調試是一個更大的問題。

編輯:雖然我們在它,我誤解你的代碼。我認爲它只是隨時間返回一個字符串,但它似乎將時間添加到傳入的字符串中。這可能比我認爲的要好。然而,如果你願意,你可以讓這個函數完成所有的工作 - 在放入時間戳之前,它將"log/"放入字符串中。這並不難。

+0

非常感謝! – iBacchus 2009-09-15 05:54:25

1

聽起來像你大多解決它已經 - 給像你描述的創建一個文件:

char filename[256] = "log/"; 
timeStamp(filename); 
f = fopen(filename, "a"); 

或者你希望你做更多的事情?

+0

爲什麼不只是'char filename [256] =「log /」;'? – 2009-09-15 05:26:05

+0

更改爲使用snprintf,strncat和朋友,我會給你一個+1。不要鼓勵緩衝區溢出 – 2009-09-15 06:18:23

+1

謝謝,你是正確的。 – 2009-09-15 23:30:38

1

步驟在C++創建(或寫入)一個順序訪問的文件:

1.Declare流變量名:

ofstream fout; //each file has its own stream buffer 

ofstream的是短期的輸出文件流 Fout爲流變量名稱 (並且可能是任何合法的C++變量名稱)。 命名流變量「fout」有助於記住 信息將「出」到文件中。

2.Open該文件:

fout.open(文件名,IOS ::出);

FOUT是先前聲明流變量名 「scores.dat」是文件 IOS的​​名字::出來的蒸汽操作模式 (你的編譯器可能不要求您指定 流操作模式。 )

3。將數據寫入到文件中:

fout<<grade<<endl; 
fout<<"Mr"; 

的數據必須與空格字符或結束行字符(回車)分離,或者數據將在文件中同時運行並且是不可讀。嘗試按照您在屏幕上顯示的方式將數據保存到文件中。

如果使用iomanip.h頭文件,您將能夠使用熟悉的格式化命令和文件輸出。

fout<<setprecision(2); 
fout<<setw(10)<<3.14159; 

4.Close文件:

fout.close(); 

關閉文件寫入保留在緩存的文件中的任何數據,釋放從程序文件,並更新文件目錄,以反映該文件的新尺寸。只要您的程序完成訪問該文件,該文件應該關閉。大多數系統在程序終止時關閉任何數據文件。如果數據在程序終止時保留在緩衝區中,您可能會丟失該數據。別抓住機會---關閉文件!

3

這個怎麼樣:

#include <stdio.h> 
#include <time.h> 

#define LOGNAME_FORMAT "log/%Y%m%d_%H%M%S" 
#define LOGNAME_SIZE 20 

FILE *logfile(void) 
{ 
    static char name[LOGNAME_SIZE]; 
    time_t now = time(0); 
    strftime(name, sizeof(name), LOGNAME_FORMAT, localtime(&now)); 
    return fopen(name, "ab"); 
} 

你會使用這樣的:

FILE *file = logfile(); 
// do logging 
fclose(file); 

記住localtime()不是線程安全的!

相關問題