【发布时间】:2016-09-25 02:40:25
【问题描述】:
我已经编写了一些代码来执行基本的 fizzbuzz 程序来测试我的日志记录类,由于某种原因,数据被很好地转储到控制台并且文件被很好地创建,但是每当我打开它时日志文件都是空的。
我的主线在这里:
int main()
{
logger* loggerObj = logger::createLogger("log.txt");
for (int i = 1; i <= 100; i++)
{
loggerObj->createLogEvent(i);
if (i == 15)
{
loggerObj->writeLog();
}
}
这是我的课:
int logger::m_instanceCount = 0;
logger* logger::loggerObj = new logger;
string logger::m_fileName = "log.txt";
logger::logger()
{
}
logger::~logger()
{
}
logger* logger::createLogger(string fileName)
{
if (m_instanceCount == 0)
{
loggerObj = new logger;
m_fileName = fileName;
return loggerObj;
}
else
{
return loggerObj;
}
}
bool logger::addLogToQueue(logEvent event)
{
if (m_queueID == 15)
{
return false;
}
else
{
queue[m_queueID] = event;
m_queueID++;
return true;
}
}
void logger::logQueue()
{
for (int i = 0; i <= m_queueID; i++)
{
int level = getEventLevel(i);
string message = getEventMessage(i);
writeLog();
}
}
int logger::getEventLevel(int logID)
{
return queue[logID].logLevel;
}
string logger::getEventMessage(int logID)
{
return queue[logID].logMessage;
}
void logger::writeLog()
{
ofstream log(m_fileName, ios::out);
log.open(m_fileName, ios::out);
log.flush();
string prefix;
int level;
string message;
int queueSize = m_queueID;
for (int i = 0; i <= queueSize - 1; i++)
{
level = queue[i].logLevel;
message = queue[i].logMessage;
switch (level)
{
case 1:
prefix = "[Fizz] ";
break;
case 2:
prefix = "[Buzz] ";
break;
case 3:
prefix = "[FizzBuzz] ";
break;
default:
prefix = "[Number] ";
break;
}
string fullMessage = prefix.append(message);
cout << fullMessage << endl;
log << fullMessage << endl;
m_queueID--;
}
log.close();
}
void logger::createLogEvent(int number)
{
logEvent event;
if (number % 3 == 0 && number % 5 == 0)
{
event.logLevel = 3;
event.logMessage = to_string(number);
}
else if (number % 3 == 0)
{
event.logLevel = 1;
event.logMessage = to_string(number);
}
else if (number % 5 == 0)
{
event.logLevel = 2;
event.logMessage = to_string(number);
}
else
{
event.logMessage = to_string(number);
}
addLogToQueue(event);
}
这是我的班级标题:
#ifndef LOGGER_INCLUDED
#define LOGGER_INCLUDED
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class logger
{
public:
~logger();
struct logEvent;
static logger* createLogger(string);
bool addLogToQueue(logEvent);
void logQueue();
void createLogEvent(int);
int getEventLevel(int);
string getEventMessage(int);
void writeLog();
private:
logger();
struct logEvent
{
string logMessage;
int logLevel;
};
static int m_instanceCount;
static logger* loggerObj;
static string m_fileName;
logEvent queue[15];
int m_queueID = 0;
};
#endif
这是我第一次尝试登录,如果是一个简单的错误,请原谅我。提前致谢。此外,这并不是设计为最好或最有效的,它只是训练,因此使用并不真正需要的单例和队列,只是尝试一些东西
【问题讨论】:
-
我不知道您是如何编写此代码的,但您应该进行增量更改和测试。在编写这样一个类的过程中,应该尽早发现无法写入文件。
-
@PaulMcKenzie 请阅读全文,我在底部概述了这只是一个训练练习。我了解编写软件的过程,通常我使用 gmock 以 TDD 方式执行此操作,但我只是尝试了一些事情,然后将其删除,因此无需全部 TDD。
-
您打开文件阅读两次。
ofstream log(m_fileName, ios::out); log.open(m_fileName, ios::out); -
@sleeptightpupper 我注释掉了 'log.open(m_fileName, ios::out);'行,它现在可以工作了。我不知道“日志”的创建会自行打开它。谢谢