2017-02-15 5 views
1
#include <iostream> 

#define LOGFATAL(msg) log(0, msg) 

std::ofstream *logst = NULL; 

void log(int sev, char *msg) 
{ if (logst == NULL) { 
     logst = new std::ofstream(); 
     logst->open("filea.txt", std::ios::out | std::ios::app); 
     *logst << "Logger started." << std::endl; 
    } 

    std::ofstream &_log = *logst; 
    _log << msg << std::endl; 
    _log.flush(); 
} 

int main() 
{ LOGFATAL("Log msg1."); 
    LOGFATAL("Log msg2."); 
    LOGFATAL("Log msg3."); 

    logst->close(); 
    delete logst; 
} 

Я открываю файл для регистрации в первый раз, когда я вхожу в журнал и продолжаю держать его открытым до конца программы.C++ ofstream не создает и не записывает файл в последующие прогоны программы

Поскольку я использую операцию flush() после каждого вызова журнала, я ожидаю, что мои сообщения будут напечатаны рядом с вами немедленно. НО ЭТО НЕ ПРОИЗОШЛО. ЗАЧЕМ?

В настоящее время, я убиваю свою программу с помощью Ctrl + C до его завершения (Не спрашивайте меня, почему). При последующих запусках программы я даже не вижу, как создается файл журнала, и даже если он уже существует, я не вижу добавления журналов. Так как я не разрешаю выполнить close(), просочился ли дескриптор файла и предотвратил будущие open() из новых программ?

Я запускаю его на RHEL 7.2, и я предполагаю, что большинство новых дескрипторов ОС в эти дни, даже если close() не называется случайно. Рассмотрение Ctrl + C - единственный способ остановить мою программу в настоящее время, что я могу сделать, чтобы моя программа регистрировалась правильно каждый раз, когда она была запущена?

Есть ли способ из системной оболочки проверить, имеются ли в моем файле журнала какие-либо пропущенные файловые дескрипторы?

+0

Как вы определяете, что ваши сообщения * не * печатаются «близко к немедленно»? Что касается убийства вашего процесса, как только он ушел, все это открытые потоки файлов, поэтому вы не должны «просачиваться» * ничего *. Процесс * ушел *. Тем не менее, вы уверены, что используете [соответствующие флаги для своего «открытого» вызова] (http://en.cppreference.com/w/cpp/io/basic_ofstream/open)? – WhozCraig

+0

Я хвост файла журнала и не вижу журналы на некоторое время после того, как я ударил flush() в gdb. Но это не самая тревожная проблема. Не открывать и писать вообще при последующих прогонах программы - это большая проблема. Я установил режимы std :: ios :: out и std :: ios :: app. Должен ли я делать что-нибудь еще? – siri

+0

Также в качестве примечания, функция регистрации должна «открывать, записывать и закрывать файл» в каждом журнале, напечатанном в проекте, чтобы лучше понять поток/активность. – sameerkn

ответ

1

Вставка std::endl будет сама очищать данные. Это работает для меня, даже если комментарий _log.flush();.

«Я ожидаю, что мои сообщения будут напечатаны близко к немедленно». Если вы используете vim, вам необходимо закрыть и снова открыть файл. Итак, используйте tail -F filea.txt, чтобы сразу увидеть результат, если данные записываются в файл.

+0

Но я не вижу ничего напечатанного в последующих прогонах программы. Я установил проверку is_open(), и я вижу, что open() даже не открывает файл. – siri

+0

@siri, так как 'fstream :: open()' ничего не возвращает, поэтому в этом случае вы бы предположили, что вы используете 'fopen', чтобы открыть файл в режиме' a + 'и проверить ошибку, если какая-либо функция через' errno variable' , – sameerkn

+0

@siri Просто для ударов используйте 'std :: ios :: out | std :: ios :: app | std :: ios :: ate' для ваших открытых флагов. И я знаю, что вы используете RHEL, но какую инструментальную цепочку? – WhozCraig

Смежные вопросы