Может стать весьма затруднительно использовать С++ в масштабных проектах, где вы просто физически не может следить за всеми переменными.
Избавиться от некоторых трудностей может помочь простой класс для ведения лога, который, в большинстве случаев (но не всегда) может избавить вас от зависимости от отладчиков.
Допустим, вы заинтересовались вопросом и у вас уже созданы файлы log.h и log.cpp. Заголовочный файл log.h будет выглядеть вот так:
#include <fstream>
using namespace std;
class Log {
public:
Log(char* filename);
~Log();
void Write(char* logline);
private:
ofstream m_stream;
};
fstream был включен для ofstream (output file system), думаю, это не новость.
Класс содержит один член private — m_stream, который будет «файловым потоком» для ведения лога.
Есть 3 функции: конструктор Log, принимающий имя файла, деструктор ~Log для закрытия файла и, наконец, функция записи Write, которая принимает строку для записи в лог.
Файл реализации log.cpp:
#include "log.h"
Log::Log(char* filename) {
m_stream.open(filename);
}
void Log::Write(char* logline) {
m_stream << logline << endl;
}
Log::~Log() {
m_stream.close();
}
Думаю, пояснений это никаких не требует, к тому же предназначение всех функций было разъяснено выше.
Этот класс очень помогает при отладке. Теперь стоит продемонстрировать пример, как он может использоваться в проекте:
#include <cstdlib>
#include "log.h"
int main(int argc, char** argv) {
Log *pLog = new Log("errors.log");
pLog->Write("Going into our loop");
for(int i = 0; i < 10; i++){
char c[50];
sprintf(c, "Looped: %d times", i);
pLog->Write(c);
}
return 0;
}
Для добавления значения переменных, как было показано выше, можно использовать sprintf
.
Это далеко не единственный способ, тут уж кто на что горазд. Наиболее рациональный способ — это использование Write с va_list (c переменным числом аргументов):
pLog->Write("Looped: %d times!", i); // no sprintf needed!
Для этого, соответственно, необходимо написать функцию с переменным числом аргументов (variadic function):
#include <stdarg.h>
#include <log.h>
void Log::Write(const char* logline, ...) {
va_list argList;
char cbuffer[1024];
va_start(argList, logline);
vsnprintf(cbuffer, 1024, logline, argList);
va_end(argList);
m_stream << cbuffer << endl;
}
Этот класс представляет лишь основную идею, вы можете модифицировать его под свои потребности, добавляя новые, необходимые вам, возможности.
Автор: Renzo