Wyjście może być zbuforowane lub niebuforowane. W przypadku buforowanego wyjścia implementacja zapisuje wszystkie dane wyjściowe, dopóki nie będzie wygodne zapisanie ich na dysku (lub gdziekolwiek). To jest dobre i wydajne, ale jeśli program się zawiesza, prawdopodobnie pewne dane zostaną utracone. Implementacja musi zapisywać niebuforowane dane wyjściowe na dysku, tak jak się pojawia, co może spowolnić proces z dużą ilością zapisów na dysku, ale jeśli nie wystąpi awaria programu podczas zapisywania, zostanie ona zapisana na dysku.
Nie ma rzeczywistej funkcjonalnej różnicy między standardowym wyjściem a standardowym błędem; to tylko dwa różne strumienie wyjściowe, które można przekierować osobno. Filozofia Unix łączenia narzędzi w łańcuchy polega na tym, że standardowe wyjście będzie miało odpowiednie wyjście, aby przejść do wejścia następnego narzędzia, a to prawie wymaga oddzielnego strumienia dla komunikatów o błędach.
Tak więc, cout
zapisuje na standardowe wyjście i jest buforowany. Użyj tego dla normalnego wyjścia. cerr
zapisuje do standardowego strumienia błędów i jest niebuforowany. Użyj tego w przypadku komunikatów o błędach. clog
zapisuje do standardowego strumienia błędów, ale jest buforowany. Jest to przydatne do rejestrowania wykonania, ponieważ nie koliduje ze standardowym wyjściem, ale jest wydajne (kosztem, że koniec dziennika może zostać utracony, jeśli program ulegnie awarii).
Kto powiedział, że cerr nie może zostać przekierowany? Ciągle to robię! –