2010-07-16 4 views
0

Dans le code ci-dessous, fputs (...) émet une affirmation sous Windows Server 2008. Je n'ai pas ce problème sur un ordinateur Vista ou XP. Je ne sais pas ce qui le cause?C++ fputs Affirmer sur Windows 2008 Server

assert est: stream = NULL

Il semble être aléatoire aussi, comme parfois il semble réussir ... que les fichiers journaux sont créées!.

Quelqu'un peut-il aider?

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; 
} 

Répondre

1

Est-ce la deuxième fputs qui est en train de s'affirmer? Est-il possible que votre vsprintf dépasse la fin de votre tampon? Votre chaîne de format et vos varargs réels peuvent ne pas correspondre correctement.

Votre question est étiquetée C++ et il y a certainement de meilleurs moyens de le faire dans cette langue. Au moins, envisagez d'utiliser std::ofstream pour écrire, au lieu de l'ancienne API C FILE* API

Mais mieux vaut oublier complètement la fonction varargs et utiliser un opérateur d'insertion comme les flux standards C++. Ensuite, vous obtenez la sécurité de type et supprimez le besoin de paramètres varargs facilement mis-pass.

+0

J'aime votre idée, je vais y jeter un coup d'oeil! –