私はロギングクラスをテストするための基本的なfizzbuzzプログラムを作成しました。何らかの理由でデータがコンソールに正しくダンプされ、私がそれを開くたびに。Ofstreamは作成しますが、ファイルに書き込むことはありません
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
@PaulMcKenzieは全体を読んでください、私は下に概略を示しました、これは単なる訓練です。私はソフトウェアを書くプロセスを理解していますが、通常はgmockを使ってTDDの方法でこれを行いますが、いくつかのことを試していて、それを削除してTDDする必要はありませんでした。 – Tyler
ファイルを開いて2回読み取ります。 'ofstream log(m_fileName、ios :: out); "log.open(m_fileName、ios :: out); ' –