La différence de ces 3 flux est la mise en mémoire tampon.
- Avec cerr, la sortie clignote
- immédiatement (car cerr n'utilise pas de tampon).
- En cas d'engorgement, la sortie coule
- après avoir terminé votre fonction actuelle.
- appeler explicitement la fonction flush.
- Avec cout, la sortie clignote
- après avoir appelé les flux de sortie (cout, cerr, clog).
- après avoir terminé votre fonction actuelle.
- appeler explicitement la fonction flush.
Vérifiez le code suivant, et exécutez DEBUG à travers 3 lignes : f(std::clog), f(std::cerr), f(std::out), puis ouvrez 3 fichiers de sortie pour voir ce qui se passe. Vous pouvez intervertir ces 3 lignes pour voir ce qui se passe.
#include <iostream>
#include <fstream>
#include <string>
void f(std::ostream &os)
{
std::cin.clear(); // clear EOF flags
std::cin.seekg(0, std::cin.beg); // seek to begin
std::string line;
while(std::getline(std::cin, line)) //input from the file in.txt
os << line << "\n"; //output to the file out.txt
}
void test()
{
std::ifstream in("in.txt");
std::ofstream out("out.txt"), err("err.txt"), log("log.txt");
std::streambuf *cinbuf = std::cin.rdbuf(), *coutbuf = std::cout.rdbuf(), *cerrbuf = std::cerr.rdbuf(),
*clogbuf = std::clog.rdbuf();
std::cin.rdbuf(in.rdbuf()); //redirect std::cin to in.txt!
std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!
std::cerr.rdbuf(err.rdbuf());
std::clog.rdbuf(log.rdbuf());
f(std::clog);
f(std::cerr);
f(std::cout);
std::cin.rdbuf(cinbuf);
std::cout.rdbuf(coutbuf);
std::cerr.rdbuf(cerrbuf);
std::clog.rdbuf(clogbuf);
}
int main()
{
test();
std::cout << "123";
}