• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] Jaki jest sens korzystania z std::cerr?

Object Storage Arubacloud
+1 głos
5,957 wizyt
pytanie zadane 9 czerwca 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
Witam,

 

ostatnio zastanawiałem się jaki jest sens korzystania z std::cerr. Ja zawsze, jeśli wystąpi jakiś błąd, wypisuję to za pomocą std::cout. Rozumiem, że std::cerr zapisuje (?) treść do deskryptora stderr, a nie do stdout jak std::cout, ale jaka jest różnica?

 

Z góry dziękuję za odpowiedź.

Pozdrawiam.

3 odpowiedzi

+3 głosów
odpowiedź 9 czerwca 2018 przez adrian17 Ekspert (344,860 p.)
wybrane 25 czerwca 2018 przez Hiskiel
 
Najlepsza

Zaleta jest taka, że można łatwo odizolować "regularne" wyjście programu od wszelkiego typu ostrzeżeń czy błędów.

Jest to bardzo przydatne w zastosowaniach konsolowych, gdy często używane jest przekierowywanie strumieni. Pozwala to na pokazywanie ostrzeżeń bez zakłócania "normalnego" ciągu danych, na przykład:

$ find . -name test | grep stuff > wynik.txt
find: ‘./.gvfs’: Permission denied

`find` dał błąd o braku dostępu do jednego z katalogów, ale ostrzeżenie to pokazało się na konsoli, zamiast zostać przesłanym do grepa. Plik `wynik.txt` zawiera wyniki jakich się spodziewamy, bez żadnych innych komunikatów.

Innym prostym przykładem jest uruchomienie narzędzia i zalogowanie wyjścia i błędów do osobnych plików:

./program > output.txt 2> errors.txt

 

+2 głosów
odpowiedź 9 czerwca 2018 przez mokrowski Mędrzec (155,460 p.)

Taka że możesz zapisać ten strumień tam gdzie chcesz. Np. tak:

myFancyApp.exe 2> error_file.txt 

Teraz na konsolę trafia wszystko to co zapisujesz do std::cout, a do pliku error_file.txt trafi wszystko co zapiszesz do std::cerr. Tak samo się to robi i w GNU/Linux.

A... i leszcze jest strumień std::clog. Domyślnie jest skierowany na std::cerr ale można go przekierować w programie np. na plik. Wtedy możesz oprócz normalnego działania (std::cout), strumienia błędów (std::cerr) mieć jeszcze log w pliku zapisując do std::clog.

komentarz 9 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)
A który numer ma clog?
komentarz 9 czerwca 2018 przez mokrowski Mędrzec (155,460 p.)

Domyślnie jest skierowany na std::cerr...

a więc domyślnie nr. 2. Ale (jak napisałem), został stworzony do wydzielenia do innego ... miejsca (domyślnie pliku).

Zresztą... każdy strumień możesz skierować gdzie chcesz i skąd chcesz w C++. Możesz zdecydować np. że std::cout trafi do okienka w aplikacji GUI.

komentarz 9 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)
No ale w takim razie nie będzie można osobno zapisać cerr i clog
1
komentarz 9 czerwca 2018 przez mokrowski Mędrzec (155,460 p.)

Oczywiście że można...

został stworzony do wydzielenia do innego ... miejsca

...

#include <iostream>
#include <fstream>

int main() {
    std::ofstream file("clog_log.txt");
    // Ew. sprawdzenie poprawności otwarcia... 
    auto oldClogBuf = std::clog.rdbuf(file.rdbuf());

    std::cout << "Komunikat na cout.\n";
    std::cerr << "Komunikat na cerr.\n";
    std::clog << "Komunikat na clog.\n";

    // Przywrócenie pierwotnego celu dla std::clog
    std::clog.rdbuf(oldClogBuf);
}

To samo możesz zrobić dla dowolnego innego strumienia. Np. spowodować by odpowiedzi których oczekuje program na std::cin, trafiały z pliku, przekierować standardowe wyjście std::cout z konsoli do pliku w celu przeprowadzenia testu poprawności działania programu itp..

0 głosów
odpowiedź 9 czerwca 2018 przez RafalS VIP (122,820 p.)
Obstawiam ze pewnie mozesz ustawic gdzie ma byc wypisywany std err. I mozesz go przekierować do pliku. Albo do czegos innego np stringa

Podobne pytania

+3 głosów
4 odpowiedzi 1,489 wizyt
pytanie zadane 2 marca 2018 w C i C++ przez Mihost Nowicjusz (240 p.)
0 głosów
1 odpowiedź 283 wizyt
pytanie zadane 22 lipca 2015 w C i C++ przez Wiktor Stary wyjadacz (11,120 p.)
+1 głos
1 odpowiedź 140 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...