#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 - единственный способ остановить мою программу в настоящее время, что я могу сделать, чтобы моя программа регистрировалась правильно каждый раз, когда она была запущена?
Есть ли способ из системной оболочки проверить, имеются ли в моем файле журнала какие-либо пропущенные файловые дескрипторы?
Как вы определяете, что ваши сообщения * не * печатаются «близко к немедленно»? Что касается убийства вашего процесса, как только он ушел, все это открытые потоки файлов, поэтому вы не должны «просачиваться» * ничего *. Процесс * ушел *. Тем не менее, вы уверены, что используете [соответствующие флаги для своего «открытого» вызова] (http://en.cppreference.com/w/cpp/io/basic_ofstream/open)? – WhozCraig
Я хвост файла журнала и не вижу журналы на некоторое время после того, как я ударил flush() в gdb. Но это не самая тревожная проблема. Не открывать и писать вообще при последующих прогонах программы - это большая проблема. Я установил режимы std :: ios :: out и std :: ios :: app. Должен ли я делать что-нибудь еще? – siri
Также в качестве примечания, функция регистрации должна «открывать, записывать и закрывать файл» в каждом журнале, напечатанном в проекте, чтобы лучше понять поток/активность. – sameerkn