我正在尝试使用适用于Linux和Windows的客户端与Mac配合使用。我有一个日志类,所以我可以看到发生了什么并捕获错误,但我的日志文件甚至没有输出。日志文件是全局声明的,所以它至少应该输出日志文件头。我正在使用带有Xcode的终端版C ++。
这是我的日志代码:
log.h
#ifndef LOG_H
#define LOG_H
#include <fstream>
using namespace std;
class Log
{
public:
// Constructor / Destructor
Log();
~Log();
// Class functions
void writeNewline();
void writeError(char * text,...);
void writeSuccess(char * text,...);
private:
ofstream logfile;
};
#endif
log.cpp
#include <ctime>
#include <stdarg.h>
#include "log.h"
const int BUFFER_SIZE = 1024;
using namespace std;
Log::Log()
{
// Create a log file for output
logfile.open ("lanternlog.txt", ios::out);
// Grab the current system time
time_t t = time(0);
struct tm * now = localtime( & t );
// TODO: Format the time correctly
// Insert the time and date at the top
logfile << "<---> Logfile Initialized on " << now->tm_mon + 1 << "-" <<
now->tm_mday << "-" << now->tm_year + 1900 << " at " << now->tm_hour <<
":" << now->tm_min << ":" << now->tm_sec << endl;
}
// Destructor
Log::~Log()
{
// Close the logfile
logfile.close();
}
void Log::writeError(char * text,...)
{
// Grab the variables and insert them
va_list ap;
va_start(ap, text);
char buff[BUFFER_SIZE];
vsnprintf(buff, sizeof(buff), text, ap);
// Output to the log
logfile << "<-!-> " << buff << endl;
}
void Log::writeSuccess(char * text,...)
{
// Grab the variables and insert them
va_list ap;
va_start(ap, text);
char buff[BUFFER_SIZE];
vsnprintf(buff, sizeof(buff), text, ap);
// Output to the log
logfile << "<---> " << buff << endl;
}
void Log::writeNewline()
{
// Create a new line in the logfile
logfile << endl;
}
当应用程序关闭,并且我删除了断点时,日志文件应该已经输出了一些内容。我的所有日志命令都有一个警告。例如:
errorLog.writeSuccess("Fatal Error: Unable to initialize Lantern!");
产量:不推荐将字符串文字转换为'char *'
但是,日志文件的主要初始化不使用此方法,应该输出文件。
第一个问题解决了!检查下面的其他错误:
编辑:看来我已经进一步了解了一下。日志文件已创建,但是在harddrive / users /文件夹中创建。我怎样才能像Visual Studio一样输出到Xcode项目文件夹。
答案 0 :(得分:1)
我认为你可以处理
不推荐将字符串文字转换为'char *'
通过更改采用char *
参数的方法:
void writeError(char * text,...);
void writeSuccess(char * text,...);
采用const char *
参数
void writeError(const char * text,...);
void writeSuccess(const char * text,...);
编译器应该担心将字符串文字作为参数传递给可能尝试更改它们的函数。
是否正在创建日志文件? 我会尝试从构造函数中删除所有内容(使用#if 0 ... #endif),除了哑巴
logfile << "logfile constructed";
减少可能破坏的方式。
答案 1 :(得分:0)
我使用了您在上面提供的代码,将char*
更改为const char*
并编译并运行正常(包括预期的输出)。将在可执行文件所在的位置创建日志文件。如果您使用的是默认的XCode路径,那么它将位于Library / Developer / Xcode / DerivedData / projectname -hash / Build / Products / Debug或/ Release中,具体取决于您是以构建还是调试模式构建。
我猜你可以在创建文件时提供完整的路径,例如/var/log/lantern.txt。
附带问题:为什么不实施operator<<
,以便您可以致电log << message << endl;