ofstream 写入 hex 而不是 char*
ofstream writes hex instead of char*
我尝试编写一个简单的记录器,但 ofstream 将十六进制而不是字符写入文件。
定义:
#pragma once
#include <iostream>
#include <fstream>
#include <string>
#define LOG Logger::getInstance()
class Logger
{
public:
static Logger m_instance;
static Logger &getInstance()
{
if (m_logfile == nullptr)
{
m_logfile = new std::ofstream(m_logfile_string.c_str(),
std::ofstream::out | std::ofstream::app);
}
return m_instance;
}
Logger &operator<<(const std::string &c);
Logger &operator<<(const char c[]);
private:
static std::ofstream *m_logfile;
static std::string m_logfile_string;
Logger() {};
Logger(const Logger &) = delete;
Logger(Logger &&other) = delete;
Logger &operator=(const Logger &other) = delete;
Logger &operator=(Logger &&other) = delete;
~Logger()
{
if (m_logfile != nullptr)
m_logfile->close();
};
std::string currentDateTime() const;
};
实施。
#include "Logger.h"
#include <iostream>
#include <ctime>
Logger Logger::m_instance;
std::ofstream *Logger::m_logfile = nullptr;
std::string Logger::m_logfile_string = "log.txt";
Logger &Logger::operator<<(const std::string &c)
{
this->operator<<(c.c_str());
return *this;
}
Logger &Logger::operator<<(const char c[])
{
std::cout << currentDateTime() << " - "
<< c << std::endl;
m_logfile->operator<<(c);
return *this;
}
// Get current date/time, format is YYYY-MM-DD.HH:mm:ss
std::string Logger::currentDateTime() const
{
auto now = time(nullptr);
struct tm tstruct;
char buf[80];
tstruct = *localtime(&now);
strftime(buf, sizeof(buf), "%Y-%m-%d.%X", &tstruct);
return buf;
}
用法:
#include "Logger.h"
void main()
{
LOG << "started"; // Logger::getInstance() << "started";
}
结果:
00007FF696EF3C00
在log.txt
控制台输出是对的。
这里出了什么问题?
如果你使用
(*m_logfile)<<c;
而不是
m_logfile->operator<<(c);
它会起作用的。
原因:
- 您的语法调用的成员函数
ostream::operator<<()
未为 char*
或 string
定义。它只为 void*
定义,它始终以十六进制显示地址。
- 经典语法在这里调用非成员函数ostream
std::operator<<(...)
which has overloads for string
and char*
你使用了iostream
的成员函数:
m_logfile->operator<<(c);
没有成员函数operator<<(char* c)
,但是有operator<<(void* p)
,所以指针被隐式转换了。请参阅 ostream
上的文档。
char*
的运算符不是 class 成员函数:
ostream& operator<< (ostream& os, const char* s);
所以你需要这个代码:
operator<<(*m_logfile, c);
或更清洁:
(*m_logfile) << c;
测试示例:
#include <iostream>
int main() {
std::cout.operator<<("test");
operator<<(std::cout, "test");
std::cout << "test";
}
打印 0x400944testtest
.
我尝试编写一个简单的记录器,但 ofstream 将十六进制而不是字符写入文件。 定义:
#pragma once
#include <iostream>
#include <fstream>
#include <string>
#define LOG Logger::getInstance()
class Logger
{
public:
static Logger m_instance;
static Logger &getInstance()
{
if (m_logfile == nullptr)
{
m_logfile = new std::ofstream(m_logfile_string.c_str(),
std::ofstream::out | std::ofstream::app);
}
return m_instance;
}
Logger &operator<<(const std::string &c);
Logger &operator<<(const char c[]);
private:
static std::ofstream *m_logfile;
static std::string m_logfile_string;
Logger() {};
Logger(const Logger &) = delete;
Logger(Logger &&other) = delete;
Logger &operator=(const Logger &other) = delete;
Logger &operator=(Logger &&other) = delete;
~Logger()
{
if (m_logfile != nullptr)
m_logfile->close();
};
std::string currentDateTime() const;
};
实施。
#include "Logger.h"
#include <iostream>
#include <ctime>
Logger Logger::m_instance;
std::ofstream *Logger::m_logfile = nullptr;
std::string Logger::m_logfile_string = "log.txt";
Logger &Logger::operator<<(const std::string &c)
{
this->operator<<(c.c_str());
return *this;
}
Logger &Logger::operator<<(const char c[])
{
std::cout << currentDateTime() << " - "
<< c << std::endl;
m_logfile->operator<<(c);
return *this;
}
// Get current date/time, format is YYYY-MM-DD.HH:mm:ss
std::string Logger::currentDateTime() const
{
auto now = time(nullptr);
struct tm tstruct;
char buf[80];
tstruct = *localtime(&now);
strftime(buf, sizeof(buf), "%Y-%m-%d.%X", &tstruct);
return buf;
}
用法:
#include "Logger.h"
void main()
{
LOG << "started"; // Logger::getInstance() << "started";
}
结果:
00007FF696EF3C00
在log.txt
控制台输出是对的。
这里出了什么问题?
如果你使用
(*m_logfile)<<c;
而不是
m_logfile->operator<<(c);
它会起作用的。
原因:
- 您的语法调用的成员函数
ostream::operator<<()
未为char*
或string
定义。它只为void*
定义,它始终以十六进制显示地址。 - 经典语法在这里调用非成员函数ostream
std::operator<<(...)
which has overloads forstring
andchar*
你使用了iostream
的成员函数:
m_logfile->operator<<(c);
没有成员函数operator<<(char* c)
,但是有operator<<(void* p)
,所以指针被隐式转换了。请参阅 ostream
上的文档。
char*
的运算符不是 class 成员函数:
ostream& operator<< (ostream& os, const char* s);
所以你需要这个代码:
operator<<(*m_logfile, c);
或更清洁:
(*m_logfile) << c;
测试示例:
#include <iostream>
int main() {
std::cout.operator<<("test");
operator<<(std::cout, "test");
std::cout << "test";
}
打印 0x400944testtest
.