C ++ Logfile не выводится на Mac OSX? - PullRequest
0 голосов
/ 17 марта 2012

Я пытаюсь заставить мой клиент, который работает с Linux и Windows, работать с Mac. У меня есть класс журнала, поэтому я могу видеть, что происходит, и ловить ошибки, но мой файл журнала даже не выводится. Файл журнала объявляется глобально, поэтому он должен по крайней мере вывести заголовок файла журнала независимо от этого. Я использую терминальную версию C ++ с Xcode.

Вот мой лог-код:

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 /. Как бы я просто вывести его в папку проекта XCode, как с Visual Studio.

Ответы [ 2 ]

1 голос
/ 17 марта 2012

Я думаю, что вы можете иметь дело с

Преобразование из строкового литерала в '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";

, чтобы уменьшить количество путей его поломки.

0 голосов
/ 17 марта 2012

Я использовал код, который вы указали выше, изменил char* на const char*, и он скомпилирован и работает нормально (включая ожидаемый результат).Файл журнала будет создан в том месте, где находится исполняемый файл.Если вы используете пути XCode по умолчанию, это будет где-то в Библиотеке / Разработчике / Xcode / DerivedData / projectname-hash / Build / Products / Debug или / Release в зависимости от того, будете ли вы создавать режим Release или Debug.* Я думаю, вы могли бы указать полный путь при создании файла, например /var/log/lantern.txt.

Дополнительный вопрос: почему бы не реализовать operator<<, чтобы вы могли вызвать log << message << endl;

...