0

在下面的代码中,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;
}
4

1 回答 1

1

是第二个fputs断言吗?您是否有可能vsprintf超出缓冲区的末尾?您的格式字符串和实际可变参数可能不正确匹配。

您的问题被标记为 C++,并且在该语言中肯定有更好的方法来做到这一点。

至少考虑使用std::ofstream来代替旧的 C FILE*API 来进行写作。但更好的是完全忘记 varargs 函数并使用像 C++ 标准流这样的插入运算符。然后,您将获得类型安全并消除对容易错误传递的 varargs 参数的需要。

于 2010-07-16T15:47:41.047 回答