【问题标题】:Ofstream creates but wont write to fileOfstream 创建但不会写入文件
【发布时间】: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);'行,它现在可以工作了。我不知道“日志”的创建会自行打开它。谢谢

标签: c++ file logging ofstream


【解决方案1】:
ofstream log(m_fileName, ios::out);
log.open(m_fileName, ios::out);

构造函数打开文件。

紧接着,第二行再次尝试open() 文件。那是一个错误。文件流的std::failbit被设置了,后续的写操作都失败了。

【讨论】:

    【解决方案2】:

    这个问题现在已经修复了,我不知道它被打开了两次。

    【讨论】:

    • 需要更多细节才能作为有用的答案。目前这是一个冒充答案的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    相关资源
    最近更新 更多