Файловый ввод/вывод глючит в dll

Тема в разделе "WASM.BEGINNERS", создана пользователем Zlyden, 20 сен 2009.

  1. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Не могу понять логику файлового вывода в dll. Он то работает, то нет.
    Visual C++ 2005, Windows XP.
    Если в настройках не указано название файла логов, то логи исправно пишутся в дефолтный файл. Если в настройках указать дефолтный файл, то логи так же пишутся. Если в настройках указать другой файл, то логи пишутся в половине случаев. Притом программа без ошибок определяет имя, создает файл логов, открывает его, доходит до функций записи в файл. А вот запишет ли она что-то в файл - неизвестно. Запускал несколько раз, логи то пишутся, то нет. Уже не знаю, что и думать.
    Код (Text):
    1.         char* homepath = "";
    2. #else
    3.         char* homepath = g_EngineMgr->GetBaseDir();
    4. #endif
    5.         char * logfile = g_ConfigMgr->GetStr(vaf("%s/logfile",g_EngineMgr->GetModDir()));
    6.         if(!logfile || (logfile && !*logfile)){
    7.             delete (logfile);
    8.             logfile = "logs.log";
    9.         }
    10.         char * name = va("%s%s\\%s",homepath,g_EngineMgr->GetModDir(),logfile);
    11.         delete[]logfile;
    12.        
    13.         FILE *f;
    14.         if (access(name,0) == -1){
    15.             f = fopen (name, "w");
    16.             fclose (f);
    17.         }
    18.         f=fopen(name,"a");
    19.         if (!f){
    20.             return -1;
    21.         }
    22.         time_t ltime;
    23.         time(&ltime);
    24.         char *date=ctime(&ltime);
    25.         date[24]=':';
    26.         if (ltime!=ltime_global){
    27.             fwrite(date,25,1,f);
    28.             //fputs(date,f);
    29.             ltime_global=ltime;
    30.         }
    31.         fwrite(" ",1,1,f);
    32.         fwrite(text,len,1,f);
    33.         delete[]name;
    34.         delete[]homepath;
    35.         delete[]date;
    Пробовал заменить fputs на проверенную fwrite, та же история. Как мне это исправить? Или плюнуть на все и запретить изменение файла логов?
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    может fclose попробуете как-нибудь
     
  3. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Закрыть файл? В каком смысле?
     
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    в смысле того, что при буферизации теряются данные. если закрыть, а потом открыть файл заново, то возможно глюк исчезнет. если он не исчезнет, то почитайте про CreateFile/WriteFile/CloseHandle
     
  5. zicker

    zicker Member

    Публикаций:
    0
    Регистрация:
    23 дек 2008
    Сообщения:
    132
    Если правильно помню fclose помимо закрытия файла принудительно записывает его на диск. При использовании дефолтного файла работу за тебя доделывает компилятор. А если пишешь в произвольный файл вынь не всегда его из памяти на диск записывет.
     
  6. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    А, спасибо, я понял - я случайно стер fclose. Сейчас вернул, проверяю - dll правильно записывает в указанный файл логов строку. Первую. Остальные записывает в logs.log.
     
  7. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Извиняюсь за даблпост.
    Я сейчас проверил - если добавить вывод имени файла логов в логи, логи сохраняются как надо. Если имя не выводить в логи, то первая строчка логов сохранится как надо, остальные - в стандартный файл логов. Блин, до чего умный компилятор :dntknw:
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Вот за это я и не люблю их, поэтому пишу на ассемблере