我的C ++文件记录器类出了什么问题?

时间:2016-08-03 11:30:12

标签: c++ file logging io singleton

我试图在文件中总结一些实验结果。 结果在各种C ++类和文件中生成。 我希望他们都写到同一个文件。

由于这个原因,有一个定义所有内容的标题是很方便的,然后我可以将它包含在需要写入它的文件中。我应该是一个单身人士,因此不会尝试两次打开同一个文件。

看起来像这样:

#ifndef FILELOGGER_H
#define FILELOGGER_H

#include <fstream>

class FileLogger{
    std::ofstream *logfile;
    static FileLogger *s_instance;

    FileLogger()
    {

        logfile = new std::ofstream();
        logfile->open("~/results/experiments.txt", std::ios_base::app);
    }

    ~FileLogger()
    {
        std::cout << "Destructor of logger called" << std::endl;
        if(s_instance)
        {
            logfile->close();
            delete logfile;
            delete s_instance;
        }
    }

public:
    static std::ofstream *instance()
    {
        if (!s_instance)
        {
            s_instance = new FileLogger();
        }

        std::cout << "got logger" << std::endl;

        return s_instance->logfile;
    }

};

FileLogger *FileLogger::s_instance = 0;



#endif // FILELOGGER_H

我现在认为在另一个文件中我只是这样做:

#include "FileLogger.h"

然后使用

*FileLogger::instance() << "Testoutput" << std::endl;

写入文件。但是,如果我尝试一下,则不会创建该文件;如果我每手都创造它没有写入它。 我得到&#34;得到logger&#34;的输出,当通过实例方法访问记录器时调用。 我还注意到析构函数永远不会被调用。

为什么这不起作用/这是不好的风格?

2 个答案:

答案 0 :(得分:0)

放开'标题'技巧。 只需在头文件中声明一个类,在cpp文件中实现它,并使用静态计数器或静态布尔值来防止多个实例化。 我认为这比仅仅头部的单身魔术要简单得多。

答案 1 :(得分:0)

此代码

    logfile->open("~/results/experiments.txt", std::ios_base::app);

尝试使用文字名称~/results/experiments.txt打开文件。 Tilde扩展到您的主目录是由命令shell完成的(可能是bash)。您需要使用主目录的实际名称,例如:

    logfile->open("/home/yourusername/results/experiments.txt", std::ios_base::app);