Не могу понять логику файлового вывода в dll. Он то работает, то нет. Visual C++ 2005, Windows XP. Если в настройках не указано название файла логов, то логи исправно пишутся в дефолтный файл. Если в настройках указать дефолтный файл, то логи так же пишутся. Если в настройках указать другой файл, то логи пишутся в половине случаев. Притом программа без ошибок определяет имя, создает файл логов, открывает его, доходит до функций записи в файл. А вот запишет ли она что-то в файл - неизвестно. Запускал несколько раз, логи то пишутся, то нет. Уже не знаю, что и думать. Код (Text): char* homepath = ""; #else char* homepath = g_EngineMgr->GetBaseDir(); #endif char * logfile = g_ConfigMgr->GetStr(vaf("%s/logfile",g_EngineMgr->GetModDir())); if(!logfile || (logfile && !*logfile)){ delete (logfile); logfile = "logs.log"; } char * name = va("%s%s\\%s",homepath,g_EngineMgr->GetModDir(),logfile); delete[]logfile; FILE *f; if (access(name,0) == -1){ f = fopen (name, "w"); fclose (f); } f=fopen(name,"a"); if (!f){ return -1; } time_t ltime; time(<ime); char *date=ctime(<ime); date[24]=':'; if (ltime!=ltime_global){ fwrite(date,25,1,f); //fputs(date,f); ltime_global=ltime; } fwrite(" ",1,1,f); fwrite(text,len,1,f); delete[]name; delete[]homepath; delete[]date; Пробовал заменить fputs на проверенную fwrite, та же история. Как мне это исправить? Или плюнуть на все и запретить изменение файла логов?
в смысле того, что при буферизации теряются данные. если закрыть, а потом открыть файл заново, то возможно глюк исчезнет. если он не исчезнет, то почитайте про CreateFile/WriteFile/CloseHandle
Если правильно помню fclose помимо закрытия файла принудительно записывает его на диск. При использовании дефолтного файла работу за тебя доделывает компилятор. А если пишешь в произвольный файл вынь не всегда его из памяти на диск записывет.
А, спасибо, я понял - я случайно стер fclose. Сейчас вернул, проверяю - dll правильно записывает в указанный файл логов строку. Первую. Остальные записывает в logs.log.
Извиняюсь за даблпост. Я сейчас проверил - если добавить вывод имени файла логов в логи, логи сохраняются как надо. Если имя не выводить в логи, то первая строчка логов сохранится как надо, остальные - в стандартный файл логов. Блин, до чего умный компилятор