Я ищу пример, который различает cerr
а также cout
в С ++?
Когда мне нужно использовать cerr
?
Многие операционные системы позволяют перенаправлять ввод и вывод из / в файлы. Когда конечные пользователи перенаправляют ваш вывод в файл, конечные пользователи не видят ничего, что вы пишете cout
; если вы хотите, чтобы ваш вывод был виден конечным пользователям, вам нужен отдельный поток, в который вы печатаете для них сообщения.
Предположим, вы пишете программу, которая читает из стандартного ввода построчно и записывает эти строки в стандартный вывод в отсортированном порядке. Допустим, ваша программа принимает параметр командной строки, который говорит, нужно ли сортировать вывод в порядке возрастания или убывания. Если конечные пользователи передают недопустимое значение для этого параметра, вы хотите напечатать сообщение "Invalid flag"
на консоль. Печать его cout
было бы неправильно, потому что cout
может быть перенаправлен в файл, чтобы пользователи не видели его. Правильное решение в этой ситуации — написать это сообщение cerr
,
Довольно часто пользователь вашей программы интересуется только результатами, потому что они выводятся на стандартный вывод, например, если вы используете команду unix cat, например:
$ cat file.txt
Вы ожидаете, что содержимое файла file.txt появится в stdout. Однако, если что-то случится во время выполнения cat (строго говоря, со мной ничего не случалось), вы ожидаете, что оно перейдет в stderr, таким образом, как пользователь, вы все равно сможете разделить их, например, :
$ cat file.txt 1>result.txt 2>stderr.txt
Предположим, я хочу собрать содержимое нескольких файлов, я делаю следующее
$ cat *.java 1>all_files_conent.java 2>errors.txt
В случае, если какой-либо из файлов недоступен (например, из-за разрешений), error.txt будет иметь соответствующее сообщение:
cat: Controller.java: Permission denied
Но содержимое all_files_content.java настолько корректно, насколько это возможно.
Поэтому, если сообщение является реальным продуктом вашей программы, вы должны использовать cout, если это просто сообщение о состоянии, используйте cerr. Конечно, все это не имеет большого значения, если то, что идет на консоль, является просто побочным продуктом. Тем не менее, вы все равно можете разрешить пользователю разделять их, как в примере выше.
std::cout
: Обычный вывод (консольный вывод)
std::cerr
: Ошибка вывода (ошибка консоли)
Гугл твой друг 🙂