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

Od Petr Zemek, 2010-02-13

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.

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
1 + 0 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.