Ofstream创建但不会写入文件 [英] Ofstream creates but wont write to file
问题描述
我已经编写了一些代码,该代码执行基本的fizzbuzz程序来测试我的日志记录类,出于某种原因,数据可以很好地转储到控制台,并且可以很好地创建文件,但是无论何时打开日志文件,它都是空的.
I have wrote some code that does a basic fizzbuzz program to test my logging class, for some reason the data is dumped to the console fine and the file is created fine however the log file is empty whenever I open it.
我的主要人员在这里:
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
这是我第一次尝试登录,因此,如果它是一个简单的错误,请原谅我.提前致谢.同样,这并不是设计成最好或最有效的方法,它只是培训,因此使用了并不是真正需要的单例和队列,只是尝试一些东西
This is my first time trying logging so if its a simple mistake please forgive me. Thanks in advance. Also this is not designed to be the best or most efficient, its merely training hence the use of singletons and queues that aren't really needed, just trying some stuff out
推荐答案
ofstream log(m_fileName, ios::out);
log.open(m_fileName, ios::out);
构造函数打开文件.
此后,第二行立即尝试再次open()
文件.那是一个错误.文件流的std::failbit
已设置,并且所有后续写操作均失败.
Immediately afterwards, the second line attempts to open()
the file again. That's an error. The file stream's std::failbit
is set, and all subsequent write operations fail.
这篇关于Ofstream创建但不会写入文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!