Jste zde

Méně známé skutečnosti o C a C++: Standardní proud clog

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" << endl;

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" << endl;
 
    // 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.

Přidat komentář