C ++ cout like function,它将数据写入文件(日志记录)

时间:2017-01-20 15:16:12

标签: c++ logging cout

我这几天都是这样,我想我错过了一些简单的事情。 这就是cout的工作原理:

cout << "Testing" << 5;

请注意,输入可以是任何内容,字符串,int等。而不是cout我想使用Log,并捕获所有数据并将其写入文件。这是想要的:

log << "Testing" << 5;

最近我得到了。 部首:

class LogFile {
public:
    void write(std::string input);
    int operator<<(const char u[100]);
    int operator<<(const int u);
};

C ++

int LogFile::operator<<(const char u[100]) {
    std::string s;
    std::stringstream ss;
    ss << u;
    s = ss.str();
    this->write(s);
    return 0;
};
int LogFile::operator<<(const int u) {
    std::string s;
    std::stringstream ss;
    ss << u;
    s = ss.str();
    this->write(s);
    return 0;
};

运行的代码(仅写入“Testing”,忽略int):

LogFile log;
log << "Testing" << 5;

目标是编写一个模仿cout的函数,但不是打印,而是将数据写入文件。任何建议或帮助表示赞赏!

3 个答案:

答案 0 :(得分:2)

您可以使用模板operator<<

#include <sstream>
struct Log
{
    void write(std::string const& s);

    template<class T>
    Log& operator<<(T const& msg)
    {
        std::stringstream ss;
        ss << msg;
        write(ss.str());
        return *this;
    }
};

这可能是一种用法:

int main(int argc, char **argv)
{
    Log log;
    log << 8;
    log << "Hello, " << "World!";
    std::string msg("plop");
    log << msg;
}

Demo

答案 1 :(得分:1)

回答问题(尽管使用不同方法可以更好地实现目标):

您的operator <<返回0 - 整数类型。当你在返回值上调用operator<<时,你最终调用内置的按位移位运算符,它只是将0按位0移位,丢弃结果。

如果您尝试log << "Testing" << "Testing";

,您会看到编译错误

要修复代码,您的operator<<应该返回对*this的引用 - LogFile类型的对象。

答案 2 :(得分:1)

&#34;模仿cout的功能&#34; - cout 一个函数。这是对象。您尝试做的是创建一个对象,可以与流插入器一起使用并写入日志文件。 std::ofstream可能会在这里使用。