Z wersji roboczej standardowego dokumentu C ++ 17:
30.4.3 Obiekty o wąskim strumieniu [narrow.stream.objects]
istream cin;
1 Obiekt cin
steruje wejściem z bufora strumieniowego związanego z obiektem stdin
, zadeklarowanym w <cstdio>
(30.11.1).
2 Po cin
zainicjowaniu obiektu cin.tie()
zwraca &cout
. basic_ios<char>::init
Poza tym jego stan jest taki sam, jak wymagany w (30.5.5.2).
ostream cout;
3 Obiekt cout
steruje wyjściem do bufora strumieniowego związanego z obiektem stdout
, zadeklarowanym w <cstdio>
(30.11.1).
ostream cerr;
4 Obiekt cerr
steruje wyjściem do bufora strumieniowego związanego z obiektem stderr
, zadeklarowanym w<cstdio>
(30.11.1).
5 Po cerr
zainicjowaniu obiektu cerr.flags() & unitbuf
jest niezerowa i cerr.tie()
zwraca &cout
. basic_ios<char>::init
Poza tym jego stan jest taki sam, jak wymagany w (30.5.5.2).
ostream clog;
6 Obiekt clog
steruje wyjściem do bufora strumieniowego związanego z obiektem stderr
, zadeklarowanym w <cstdio>
(30.11.1).
Dyskusja...
cout
pisze do stdout
; cerr
i clog
dostderr
Standardowe wyjście (stdout
) ma na celu odbieranie z programu bezbłędnych, niediagnostycznych danych wyjściowych, takich jak dane wyjściowe z pomyślnego przetwarzania, które mogą być wyświetlane użytkownikowi końcowemu lub przesyłane strumieniowo do dalszego etapu przetwarzania.
Standard Error ( stderr
) jest przeznaczony do diagnostyki danych wyjściowych, takich jak ostrzeżenia i komunikaty o błędach, które wskazują, że program nie wygenerował lub mógł nie wygenerować danych wyjściowych, których użytkownik mógłby się spodziewać. Te dane wejściowe mogą być wyświetlane użytkownikowi końcowemu, nawet jeśli dane wyjściowe są przesyłane potokiem do dalszego etapu przetwarzania.
cin
i cerr
są przywiązanicout
Obaj opróżniają się cout
przed samodzielną obsługą operacji we / wy. Zapewnia to, że podpowiedzi wysyłane do cout
są widoczne przed blokami programu, z których mają odczytać dane wejściowe cin
, oraz że wcześniejsze wyjście do cout
jest opróżniane przed zapisaniem błędu cerr
, co utrzymuje komunikaty w chronologicznej kolejności ich generowania, gdy oba są kierowane do tego samego terminala / pliku / itp..
Kontrastuje to z clog
- jeśli tam napiszesz, nie będzie buforowany i nie będzie z niczym powiązany, więc przed opróżnieniem będzie buforował przyzwoite ilości logowania. Zapewnia to największą przepustowość komunikatów, ale oznacza, że komunikaty mogą nie być szybko widoczne dla potencjalnego konsumenta czytającego terminal lub śledzącego dziennik.
stdout
,stdin
(dlacin
) istderr
używa go domyślnie. Uważam, żeclog
jest to tylkocerr
zmiana buforująca.