Když se zeptáte programátora v C++ na standardní proudy (streams), tak vám většinou odpoví cin
, cout
a cerr
(případně s kvalifikátorem std::
). Již méně se ale ví, že těchto standardních proudů je více -- patří mezi ně mj. ještě clog
(celkem existuje osm standardních proudů, ale to je pro nás teď nepodstatné). Tento proud a jeho možné využití bych vám chtěl velmi krátce představit v následujícím příspěvku.
Úvod anebo co to ten clog je?
Stejně jako ostatní jmenované, je clog
objekt třídy ostream
a je vytvořen a inicializován při startu programu (při includování příslušného hlavičkového souboru iostream
). Použití je pak stejné, jako u ostatních výstupních proudů:
clog << "text\n";
Standardně jde výstup do konzole, resp. na stejné místo, jako cerr
, resp. stderr
, čili standardní chybový výstup. Rozdíl oproti cerr
je zřejmě jediný, a to ten, že clog
je bufferovaný (buffered).
K čemu se to dá použít?
Jak již název napovídá, tak je tento proud možno použít k logování. Když se nad tím ale zamyslíte, tak by bylo vhodné, aby bylo možno logovat místo na standardní chybový výstup do nějakého souboru. To lze zařídit následujícím postupem.
#include <iostream> #include <fstream> using namespace std; int main() { // Otevřete soubor, do kterého budete chtít logovat // (test na úspěšnost otevření byl z důvodu přehlednosti vynechán) ofstream logStream("/tmp/log.txt"); // Uložíte si původní clog buffer streambuf *oldClogBuf = clog.rdbuf(); // Změníte buffer u clog na buffer z vytvořeného logovacího proudu clog.rdbuf(logStream.rdbuf()); // Logujete do souboru clog << "text\n"; // Obnovíte původní buffer clogu (nutné! jinak dojde k poruše ochrany paměti // při ukončení programu, kdy se provádí flush() standardních proudů; // logStream a jeho buffer je totiž zrušen při výstupu z funkce main()) clog.rdbuf(oldClogBuf); }
Je to sice poněkud těžkopádné, ale na jednoduché logování to může stačit (využíváme toho, že clog
je globálně přístupný). V případě větších projektů bude lepší využít různé specializované knihovny (např. log4cpp), nebo si můžete vytvořit vlastní jednoduchou logovací knihovnu. Cílem tohoto příspěvku bylo především poukázat na to, že něco takového v C++ existuje.