2015-01-15 68 views
0

即時爲我的程序創建一個簡單的日誌記錄系統。我有一個函數,只要在我的程序的成員函數中調用就輸出,所以無論何時執行一個操作,它都會被記錄到一個文本文件中。但是,當我希望每個動作都記錄在新行中時,似乎每次都會覆蓋文件的第一行。文件輸出覆蓋第一行 - C++

void Logger::log(int level, std::string message, std::string source) 
{ 
    time_t rawtime; 
    struct tm * timeinfo; 
    char buffer[80]; 

    time (&rawtime); 
    timeinfo = localtime(&rawtime); 

    strftime(buffer,80,"%d-%m-%Y %I:%M:%S",timeinfo); 
    std::string str(buffer); 

    std::ofstream fout(source); 
    if (fout.is_open()) 
    { 
     fout<<"Logging Level: "<<level<< " - " << str <<" - " << message <<std::endl; 
     fout<<"test"<<std::endl; 
     fout.close(); 
    } 
} 

無論調用次數多少,記錄器只輸出(正確)最後一次採取的動作。任何人都可以讓我知道爲什麼這不起作用?

文件輸出:

Logging Level: 1 - 15-01-2015 09:13:58 - Function called: grow() 

test 

日誌調用示例:

arrayLogger.log(1, "Function called: writeOut()", "logger.txt"); 
+1

根據http://en.cppreference.com/w/cpp/io/basic_filebuf/open,如果你調用'std :: ofstream'的構造函數,它會調用默認的實現,它的open_mode設置爲' out「,正如你所看到的,將永遠放棄已存在於文件中的任何內容。你應該用'out |打開它app'。 – Creris

+0

非常感謝你們倆,不要忘了將來! – user3027864

回答

1

你打開文件,每次,這將覆蓋任何現有的內容寫。你應該(a)在該函數之外打開文件,可能通過將ofstream對象作爲類成員,然後你的函數將簡單地追加到它,或者(b)打開追加文件,如下所示:

std::ofstream fout(source, std::ofstream::out | std::ofstream::app); 
+0

'std :: ofstream :: binary'(我認爲名字是)也可以被使用,因爲Windows可能會改變處理事物的行爲(即使閱讀,它應該被添加用於完整性)。 – Creris

+0

我認爲你不想打開文件作爲二進制文件,以允許std :: endl適當的平臺翻譯,特別是因爲OP沒有打開文件爲二進制文件,顯然沒有任何問題就這樣。爲什麼引入更復雜的?無論如何,這只是主要的一點。 –

+0

哦,當然,我從不同的問題轉移了二進制文件的想法。對不起。 – Creris