Избавиться от некоторых трудностей может помочь простой класс для ведения лога, который, в большинстве случаев (но не всегда) может избавить вас от зависимости от отладчиков.
Допустим, вы заинтересовались вопросом и у вас уже созданы файлы 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; }
Этот класс представляет лишь основную идею, вы можете модифицировать его под свои потребности, добавляя новые, необходимые вам, возможности.
ссылка на оригинал статьи http://habrahabr.ru/post/182452/
Добавить комментарий