C ++ fputs Assert на Windows 2008 Server - PullRequest
0 голосов
/ 16 июля 2010

В приведенном ниже коде fputs (...) генерирует подтверждение при работе на Windows Server 2008. У меня нет этой проблемы на компьютере с Vista или XP.Я в недоумении относительно того, что его вызывает?

Утверждение: Stream! = NULL

Это тоже кажется случайным, как иногда это кажется успешным ... какфайлы журналов создаются.

Кто-нибудь может помочь?

void DLog::Log(const char *fmt, ...)
{
    va_list varptr;

    va_start(varptr, fmt);

    int n = ::_vscprintf(fmt, varptr);
    char *buf = new char[n + 1];
    ::vsprintf(buf, fmt, varptr);

    va_end(varptr);

    if (!m_filename.empty())
    {
        FILE *f = fopen(m_filename.c_str(), "at");
        if (f != NULL)
        {
            fputs(buf, f);
            fputs("\n", f);
            fclose(f);
        }
        else
            ::MessageBox(0,"Error at fputs in Log","Error",0);
    }


    delete [] buf;
}

1 Ответ

1 голос
/ 16 июля 2010

Это второй fputs, который утверждает? Возможно ли, что ваш vsprintf обгоняет конец буфера? Ваша строка формата и фактические значения могут не совпадать.

Ваш вопрос помечен C ++, и на этом языке, безусловно, есть лучшие способы сделать это.

По крайней мере, рассмотрите возможность использования std::ofstream для написания текста вместо старого C FILE* API. Но лучше все же полностью забыть функцию varargs и использовать оператор вставки, такой как стандартные потоки C ++. Затем вы получаете безопасность типов и избавляете от необходимости легко пропущенных параметров varargs.

...