SDL遊戲開發教程06(利用BOOST庫實現簡單的文件日誌功能)

    在利用SDL開發程序時,由於是窗口程序,所以std::cout<<""<<std::endl都不知道輸出到哪裏去了。但有時爲了跟蹤程序的運行狀態,需要打印代碼運行時的一些信息,這時就需要一個方便使用的日誌記錄類。

    要在文件中記錄日誌信息,不可避免的就要讀寫文件和獲取系統時間,遺憾的是C++標準中沒有這方面的庫。這時就需要使用BOOST庫,BOOST中提供了很方便的操作文件和時間的庫。

    前面第一節介紹的mingw裏面包含了boost1.37,但沒有包含編譯好的動態庫,需要我們自己手工編譯,然後放到mingw中來,這裏(http://public0821.iteye.com/blog/291163 )專門介紹瞭如何編譯和使用boost庫。由於我們已經有了boost的頭文件,所以不需要它裏面介紹的拷貝頭文件那一步。

    下面請看日誌類的代碼:

#ifndef SDLLOG_H_
#define SDLLOG_H_
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
namespace fs = boost::filesystem;
const std::string DEFAULT_LOG_FILE = "log.log";
class SDLLog
{
	friend class SDL;
private:
	/**
	 * bAppend	程序重啓後,寫日誌時是追加在上次的後面還是先清空文件
	 */
	SDLLog(bool bAppend = true);
public:
	virtual ~SDLLog();
public:
	void	info(std::string info);
private:
	fs::ofstream file;
};

#endif /* SDLLOG_H_ */
 
#include "SDLLog.h"
#include <boost/date_time.hpp>
using namespace boost::filesystem;
SDLLog::SDLLog(bool bAppend)
{
	fs::path p( DEFAULT_LOG_FILE);
	if(!bAppend)
	{
		fs::remove(p);
	}

	//std::ios_base::app表示每次寫文件都是追加在後面
	file.open(p, std::ios_base::app);
}

SDLLog::~SDLLog()
{
	file.close();
}

void SDLLog::info(std::string info)
{
	using namespace boost::posix_time;
	ptime now = second_clock::local_time();
	file << "[INFO]" << to_iso_extended_string(now.date())
		<<' '<<to_simple_string(now.time_of_day()) 
		<<"  "<<info <<std::endl;
}

 

    代碼比較簡單,所以這裏不做解釋。使用時的代碼爲:SDL::log()->info("測試");最後寫在文件中的日誌格式爲:[INFO]2008-12-15 19:40:40  測試

    由於用到了boost的filesystem和datetime庫,需要在鏈接的地方指定連接文件名稱,如下圖


 

    附件中提供了這裏用到的BOOST動態庫和LIB文件,對於不想自己編譯BOOST庫的朋友來說,下載附件中的文件然後放到mingw的相應目下下就可以了,本節完整的源代碼將在後面教程中給出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章