Question

Je travaille sur l'obtention d'un code existant dans les tests unitaires et parfois la seule façon de détecter un comportement de programme existant est de la sortie de la console.

Je vois beaucoup d'exemples en ligne pour savoir comment rediriger stdout vers un autre fichier dans C ++, mais est-il possible que je peux le rediriger vers un flux en mémoire pour que mes tests ne doivent pas compter sur le disque?

Je voudrais obtenir tout ce que le code existant envoie à stdout dans un std :: string donc je peux facilement .Find sur la sortie.

Modifier

Le code existant est si mauvais qu'il utilisateurs un mélange de cout << .. et printf. Voici ce que j'ai jusqu'à présent:

void TestSuite::setUp(void)
{
    oldStdoutBuf = std::cout.rdbuf();
    std::cout.rdbuf(consoleOutput.rdbuf());
}
void TestSuite::tearDown(void)
{
    std::cout.rdbuf(oldStdoutBuf);
}

Le problème est que cela ne pas Sortie de capture à l'aide printf. Je voudrais quelque chose qui est à la fois. Toutes les idées?

Était-ce utile?

La solution

std::stringstream peut être ce que vous cherchez.

UPDATE D'accord, cela est un peu de hack, mais vous pourriez peut-être faire pour saisir la sortie printf:

char huge_string_buf[MASSIVE_SIZE];
freopen("NUL", "a", stdout);
setbuf(stdout, huge_string_buffer);

Notez que vous devez utiliser "/ dev / null" pour linux au lieu de "NUL". Cela commencera rapidement pour remplir huge_string_buffer. Si vous voulez être en mesure de continuer à rediriger la sortie après la mémoire tampon est pleine, vous devrez appeler fflush (), sinon il renvoie une erreur. Voir std::setbuf pour plus d'informations.

Autres conseils

Vous pouvez utiliser freopen(..., stdout) puis vider le fichier dans la mémoire ou std::string.

Cela peut être une alternative:

char bigOutBuf[8192];
char savBuf[8192];

fflush(stdout);
setvbuf(stdout,bigOutBuf,IOFBF,8192);//stdout uses your buffer

//after each operation
strncpy(savBuf,bigOutBuf,8192);//won't flush until full or fflush called

//...

//at long last finished
setbuf(stdout,NULL);//reset to unnamed buffer

Cette sortie intercepte juste la mémoire tampon, ainsi va encore à la console ou ailleurs.

Hope this helps.

Essayez sprintf, qui est plus efficace.

int i;
char str[] = "asdf";
char output[256];
sprintf(output, "asdfasdf %s %d\n", str, i);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top