Что такое "cerr" и "stderr"? - PullRequest
       30

Что такое "cerr" и "stderr"?

31 голосов
/ 08 июля 2010

В чем разница между ними и как они используются?Кто-нибудь может указать мне примеры?

В частности, как вы «записываете» в поток в обоих случаях и как вы восстанавливаете и выводите (то есть на экран) текст, который был записан в него?

Кроме того, вывод "экрана" сам по себе является потоком, верно?Может быть, я недостаточно хорошо понимаю потоки.Это также можно сохранить в файл, конечно, я знаю.Будет ли все это использовать fprintf / fscanf и т. Д.

Ответы [ 2 ]

42 голосов
/ 08 июля 2010

cerr - это поток C ++, а stderr - дескриптор файла C, оба представляют стандартный вывод ошибок.

Вы пишете им так же, как пишете в другие потоки и дескрипторы файлов:

cerr << "Urk!\n";
fprintf (stderr, "Urk!\n");

Я не уверен, что вы подразумеваете под "восстановлением" в этом контексте, вывод идет со стандартной ошибкой и все. Программа не должна заботиться об этом после этого. Если вы имеете в виду, как сохранить его на потом, вне программы, см. Следующий абзац.

По умолчанию они отправляются на ваш терминал, но вывод может быть перенаправлен в другое место, например:

run_my_prog 2>error.out

И, да, вывод "screen" является потоком (или дескриптором файла), но это обычно только потому, что stdout/cout и stderr/cerr по умолчанию подключены к вашему "экрану". Перенаправление повлияет на это, как в следующем случае, когда на ваш экран ничего не будет записано:

run_my_prog >/dev/null 2>&1

(несмотря на такие сложные вещи, как запись непосредственно в /dev/tty). Этот фрагмент перенаправит как стандартный вывод, так и стандартную ошибку, чтобы перейти к сегменту битов.

7 голосов
/ 08 июля 2010

В чем разница между ними

stderr является FILE* и является частью стандартной библиотеки C. cerr является ostream и является частью стандартной библиотеки C ++.

Кроме того, «экранный» вывод сам по себе поток не так ли?

Да, это так. Но на самом деле есть два потока, которые по умолчанию записывают на экран: stdout / cout для нормального вывода и stderr / cerr для сообщений об ошибках. Это полезно для перенаправления: вы можете перенаправить stdout в файл, но сообщения об ошибках по-прежнему будут отображаться на экране.

...