Ofstream создает, но не пишет в файл

Я написал некоторый код, который выполняет базовую программу 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

Я впервые пытаюсь войти в систему, поэтому, если это простая ошибка, пожалуйста, прости меня. Заранее спасибо. Кроме того, это не предназначено, чтобы быть лучшим или самым эффективным, это просто обучение, следовательно, использование синглетонов и очередей, которые на самом деле не нужны, просто пробовать некоторые вещи

 uh oh somebody needs a pupper27 мая 2016 г., 00:24
Вы открываете файл для чтения дважды.ofstream log(m_fileName, ios::out); log.open(m_fileName, ios::out);
 Tyler27 мая 2016 г., 00:28
@sleeptightpupper я прокомментировал 'log.open (m_fileName, ios :: out);' линия и сейчас работает. Я не знал, что создание журнала открывало его самостоятельно. Спасибо
 PaulMcKenzie27 мая 2016 г., 00:19
Я не знаю, как вы подошли к написанию этого кода, но вы должны делать постепенные изменения и тестирование. Невозможность записи в файл должна была быть обнаружена на ранних этапах написания такого класса.
 Tyler27 мая 2016 г., 00:23
@PaulMcKenzie, пожалуйста, прочитайте все это, я обрисовал в общих чертах внизу, что это было просто тренировочное упражнение. Я понимаю процесс написания программного обеспечения и обычно я делаю это в стиле TDD с помощью gmock, однако я просто пробовал несколько вещей, а затем удалял их, так что нет необходимости TDD все это.

Ответы на вопрос(1)

Решение Вопроса
ofstream log(m_fileName, ios::out);
log.open(m_fileName, ios::out);

Сразу после этого вторая строка пытаетсяopen() файл снова. Это ошибка. Поток файлаstd::failbit устанавливается, и все последующие операции записи завершаются неудачно.

Ваш ответ на вопрос