Cerr - обработка ошибок в C++

Эта статья пытается пролить некоторый свет на (часто игнорируемый) объект cerr в C++. ‘C’ в Сerr означает “символ” и "err" означает “ошибка”, значит Cerr означает “Ошибка символа”.

Он определен в заголовочном файле iostream и соответствует потоку C stderr. Он имеет очень похожее использование на объект cout (т. е. печать символов на консоли во время выполнения) под потоком stdout.

Различие

Даже при том, что результат обоих cout и cerr одинаков, есть очень тонкое различие между ними, которое мы можем найти в случае использования вышеупомянутых обоих потоков.

Вот пример кода, чтобы показать разницу между ними:

#include<bits/stdc++>using namespace std;int main(){cout << "Hey there, Geek! :: cout" << endl;cerr << "Hey there, Geek! :: cerr" << endl;return 0;}

Оба приведенных выше оператора будут печатать символы, но под разными консолями / контекстом. Взгляните на результат.

Выход:

Hey there, Geek! :: cout

Ошибка выполнения:

Hey there, Geek! :: cerr

Итак, что же можно извлечь из их использования?

Как правило, stdout:: cout должен использоваться для фактического вывода программы, в то время как вся информация и сообщения об ошибках должны быть напечатаны в stderr::cerr.

Например: предположим, что пользователь хочет открыть файл и перенаправить вывод на этот внешний файл. Предположим, что во время выполнения программы (из-за какой-то проблемы) открытие файла выдает ошибку. Чтобы сохранить проверку таких ошибок, разработчик должен зарегистрировать ошибку где-то, чтобы проверить ее позже. Он может использовать cerr, так как эта ошибка все еще печатается, не будучи выходом на консоль или выходной файл.

Давайте посмотрим примерную программу для этого:

#include <iostream>#include<fstream>using namespace std;int main(){char fileName[] = "data.txt";// Открытие файла с помощью объекта infile класса ifstream в заголовочном файле fstreamifstream infile(fileName);// Если файл существует, начните чтение с файлаif(infile)cout << infile.rdbuf();/* Если возникает какая-либо проблема, это сообщение отображается как ошибка.Таким образом, пользователь может четко различать между подлинным выводом и ошибками в своем коде.еще */ cerr << "Error while opening the file " << fileName <<endl;return 0;}