2017-10-19 34 views
-2

Je dois créer ma propre méthode fprintf en C++, mais en comparant le temps d'exécution de ma méthode avec celui de la méthode standard, le mien est presque 3 fois plus lent. Qu'est ce que j'ai mal fait?Writting Custom FPrintF

void FPrintF(const char *aFormat, ...) 
{ 
    va_list ap; 
    const char *p; 
    int count = 0; 
    char buf[16]; 
    std::string tbuf; 
    va_start(ap, aFormat); 
    for (p = aFormat; *p; p++) 
    { 
     if (*p != '%') 
     { 
     continue; 
     } 
     switch (*++p) 
     { 
     case 'd': 
      sprintf(buf, "%d", va_arg(ap, int32)); 
      break; 
     case 'f': 
      sprintf(buf, "%.5f", va_arg(ap, double)); 
      break; 
     case 's': 
      sprintf(buf, "%s", va_arg(ap, const char*)); 
      break; 
     } 
     *p++; 
     const uint32 Length = (uint32)strlen(buf); 
     buf[Length] = (char)*p; 
     buf[Length + 1] = '\0'; 
     tbuf += buf; 
    } 
    va_end(ap); 
    Write((char*)tbuf.c_str(), tbuf.size()); 
} 
+1

errr pouvez-vous corriger la mise en forme de votre question? –

+1

printf est assez bien écrit :). Et supporté le temps de compilation par de nombreuses compiles. –

+1

vous utilisez sprintf pour écrire à buf. Ensuite, sprintf doit analyser le format et faire la sortie. – Blacksilver

Répondre

0

Qu'avez-vous fait de mal?

Eh bien, pour un que vous utilisez sprintf pour construire votre sortie, ce qui fait à peu près ce que vous essayez de faire, ce qui n'est pas ce que font * printf série de fonctions. jetez un coup d'oeil à toute implémentation de code printf.

Mieux encore pourquoi ne pas l'utiliser?

#include <cstdio> 
#include <cstdarg> 

namespace my { 

void fprintf(const char *aFormat, ...) 
{ 
     va_list ap; 
     va_start(ap, aFormat); 
     (void)vprintf(aFormat, ap); 
     va_end(ap); 
} 

} 

int main() { 
    my::fprintf("answer is %d\n", 42); 
    return 0; 
} 
+0

Mais j'ai besoin d'écrire le buf dans mon fichier. J'ai vu que le fprintf standard reçoit un FICHIER *, mon fprintf personnalisé est dans une classe FileHandle et devrait écrire le buf dans le fichier final. –

+0

Si vous avez besoin de l'écrire dans un fichier, vous pouvez utiliser 'vsnprintf' pour créer une chaîne ou' vfprintf' pour la sauvegarder directement dans votre fichier. –