Вопрос относительно cerr суда и помехи [дубликат]

Этот вопрос уже имеет ответ здесь:

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

Я знаю, что различия как указано ниже:

1) суд может перенаправленный, но cerr не может

2) помеха может использовать буфер.

Я смущен точкой 2, я благодарен, если кто-либо может разработать ее больше.

10
задан Peter Alexander 8 March 2010 в 19:58
поделиться

3 ответа

Буферизованный вывод обычно намного быстрее, чем небуферизованный. Так что если вы хотите быстро записать огромное количество данных в журнал (но не заботитесь о том, попадут ли они туда), вы будете использовать clog, а не cerr.

И все потоки обычно можно перенаправить, если предположить, что операционная система достаточно компетентна, но это не входит в стандарт C++, в котором нет такого понятия, как "перенаправление".

3
ответ дан 3 December 2019 в 17:58
поделиться

Вывод может быть буферизованным или небуферизованным. С буферизованным выводом реализация сохраняет весь вывод до тех пор, пока его не будет удобно записать на диск (или где-нибудь еще). Это хорошо и эффективно, но если программа выйдет из строя, какой-то вывод, скорее всего, будет утерян. Реализация должна записывать небуферизованный вывод на диск по мере его возникновения, что может замедлить работу из-за большого количества операций записи на диск, но, если не произойдет сбоя программы во время ее записи, она будет записана на диск.

Нет реальной функциональной разницы между стандартным выводом и стандартной ошибкой; это просто два разных выходных потока, которые можно перенаправлять отдельно. Философия объединения инструментов Unix в цепочку заключается в том, что стандартный вывод будет иметь соответствующий вывод для ввода следующего инструмента, а для этого в значительной степени требуется, чтобы был отдельный поток для сообщений об ошибках.

Итак, cout записывает на стандартный вывод и буферизируется. Используйте это для нормального вывода. cerr записывает в стандартный поток ошибок и не буферизуется. Используйте это для сообщений об ошибках. clog записывает в стандартный поток ошибок, но буферизируется. Это полезно для ведения журнала выполнения, поскольку оно не мешает стандартному выводу, но эффективно (за счет того, что конец журнала может быть потерян в случае сбоя программы).

16
ответ дан 3 December 2019 в 17:58
поделиться

Оба могут быть перенаправлены.
В большинстве реализаций cerr не будет буферизован, не уверен, что это официальное требование POSIX, но это безумие - иметь буферизованный поток ошибок.

Причина наличия отдельных потоков - в философии unix, согласно которой вывод одной программы является входом для следующей. Если 'ls' идет прямо к 'sort', то проще вывести ошибки на консоль, чем писать sort, чтобы понять, является ли входное сообщение ошибкой или частью текста, который вы хотите отсортировать.

2
ответ дан 3 December 2019 в 17:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: