為了保持可擴充性,将控制台顔色設定和儲存檔案顔色設定分别用兩個頭檔案。 此外,因為log可能需要在整個工程的不同類中輸出資訊,是以将檔案輸出類中設計為 靜态資料成員,友善調用。
很簡單,直接看代碼吧。
#ifndef COUT_TO_FILE_H #define COUT_TO_FILE_H
#include <iostream> #include <fstream> #include <string>
using namespace std;
class CoutToFile { public: typedef enum { NONE= 0, DEBUG = 1, ERROR = 2, FATAL= 3} LogLevels; static bool isCoutToFile; static ofstream ofObj; static streambuf* coutBuf; static streambuf* fileBuf; static void SaveLog(string info, LogLevels level); };
#endif
設定輸出到控制台的顔色,預設顔色是白色,可以根據需求cout時選擇響應的顔色。 該段代碼參考引用自: http://wenku.baidu.com/view/6593f5631ed9ad51f01df2ae.html
#ifndef CONSOLE_COLORS_H #define CONSOLE_COLORS_H #include <iostream> #include <windows.h> using namespace std; inline std::ostream& blue(std::ostream &s) { HANDLE hStdout=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hStdout,FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY); return s; }
inline std::ostream& red(std::ostream &s) { HANDLE hStdout=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hStdout,FOREGROUND_RED|FOREGROUND_INTENSITY); return s; }
inline std::ostream& green(std::ostream &s) { HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hStdout,FOREGROUND_GREEN|FOREGROUND_INTENSITY); return s; }
inline std::ostream& yellow(std::ostream &s) { HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hStdout,FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY); return s; }
inline std::ostream& white(std::ostream &s) { HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hStdout, FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); return s; }
#endif
#include "CoutToFile.h" #include "ConsoleColor.h"
const string RED_BEGIN_TAG = "<span style=\"color: red;\">"; const string BLACK_BEGIN_TAG = "<span style=\"color: black;\">"; const string END_TAG = "</span>"; const string BR_TAG = "<br/>";
ofstream CoutToFile::ofObj; streambuf* CoutToFile::coutBuf = cout.rdbuf(); streambuf* CoutToFile::fileBuf = CoutToFile::ofObj.rdbuf(); bool CoutToFile::isCoutToFile = false;
void CoutToFile::SaveLog(string info, LogLevels level) { if(isCoutToFile) { if(level==3 || level==2 ) { cout<<RED_BEGIN_TAG<<endl; } else { cout<<BLACK_BEGIN_TAG<<endl; }
cout<<info<<BR_TAG<<endl;
cout<<END_TAG<<endl; } else { if( level== 2 || level==3 ) { cout<<red<<info<<white<<endl; } else { cout<<white<<info<<endl; } } }
注釋:if語句中的enum類型比較,還有一點還有問題。采用整形比較沒有問題,但是采用注釋中的類型比較,就會進到錯誤的邏輯。目前還沒有搞清楚。有清楚的同學請留言啊。
#include <iostream> #include <fstream> #include "CoutToFile.h"
using namespace std;
void SettingCout(string logSavePath, bool isSaveToFile) { CoutToFile::isCoutToFile = isSaveToFile;
if(CoutToFile::isCoutToFile) { CoutToFile::ofObj.open(logSavePath.c_str() ); cout.rdbuf(CoutToFile::fileBuf); } else { cout.rdbuf(CoutToFile::coutBuf); } }
void ResetCout() { if(CoutToFile::isCoutToFile) { cout.rdbuf(CoutToFile::coutBuf); CoutToFile::ofObj.close(); } }
int main(int argc, char* argv[]) { bool isCoutLogToFile = false; string logSavePath = "d:/Log.html"; SettingCout(logSavePath, isCoutLogToFile);
string name = "Name:Walle"; string sex = "Sex: Male"; string blog = "Blog:: http://blog.csdn.net/johnnyelf83"; CoutToFile::SaveLog(name, CoutToFile::NONE); CoutToFile::SaveLog(sex, CoutToFile::NONE); CoutToFile::SaveLog(blog, CoutToFile::FATAL); ResetCout();
system("PAUSE"); return 0; }
輸出: 1. 設定輸出到控制台:
2. 設定輸出到html檔案: