Работа с std::cerr и std::clog
Отделяйте диагностику и журналы от вывода программы с помощью потоков cerr и clog.
«Работа с std::cerr и std::clog» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Три потока вывода
Стандартная библиотека предоставляет три заранее определённых потока вывода:
- std::cout — буферизованный стандартный вывод
- std::cerr — небуферизованный стандартный поток ошибок
- std::clog — буферизованный стандартный поток ошибок
std::cerr: Ошибки и предупреждения
std::cerr записывает данные в stderr и является небуферизованным — вывод появляется немедленно, даже если сразу после этого программа аварийно завершится.
std::cerr << "Error: file not found\n";std::clog: Буферизованные журналы
std::clog также записывает данные в stderr, но, как и cout, использует буферизацию. Используйте его для обычных сообщений журнала, если небольшая задержка допустима.
std::clog << "[info] processing record 42\n";Зачем нужны два потока для stderr?
Ошибки должны появляться немедленно, чтобы пользователь увидел их до аварийного завершения программы. Журналы создаются в большом объёме — их буферизация позволяет сохранить приемлемую производительность.
Перенаправление вывода
В командной строке stdout и stderr направляются в отдельные каналы. Перенаправляйте их независимо друг от друга.
# Send stdout to a file, stderr to the terminal
./app > out.txt
# Send stderr to a file too
./app 2> err.txt
# Send both to one file
./app > all.txt 2>&1Диагностический вывод и вывод данных
По соглашению данные в формате, пригодном для чтения машиной, направляются в stdout, а диагностические сообщения для человека — в stderr. Благодаря этому конвейеры работают корректно.
Связывание потоков
По умолчанию cin связан с cout — чтение из cin сначала сбрасывает буфер cout. cerr аналогичным образом связан с cout.
Пользовательское журналирование с уровнями
Оберните clog во вспомогательные функции для уровней журнала — INFO, WARN, ERROR. Это обеспечивает единообразие сообщений журнала.
void warn(const std::string& msg) {
std::clog << "[WARN] " << msg << "\n";
}
void error(const std::string& msg) {
std::cerr << "[ERROR] " << msg << "\n";
}Производительность: cerr работает медленно
Поскольку cerr сбрасывает буфер при каждой операции, повторяющиеся записи выполняются медленно. Для интенсивного журналирования предпочитайте clog или специализированную библиотеку журналирования.
Ручной сброс буфера clog
Если во время отладки нужно, чтобы вывод clog появлялся немедленно, сбрасывайте его буфер вручную.
std::clog << "checkpoint" << std::flush;Запись в файловый поток
Те же приёмы работают с файловыми потоками. Откройте файл журнала с помощью std::ofstream и записывайте в него так же, как в clog.
std::ofstream logFile("app.log");
logFile << "Application started\n";Быстрая проверка
Какой стандартный поток автоматически сбрасывает буфер после каждой записи?
Итоги
Используйте std::cout для обычного вывода, std::cerr для срочных небуферизованных ошибок, а std::clog — для буферизованных журналов. Перенаправляйте их независимо в оболочке с помощью > и 2>.
Часто задаваемые вопросы
Урок «Работа с std::cerr и std::clog» бесплатный?
Да — полный текст урока «Работа с std::cerr и std::clog» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Работа с std::cerr и std::clog»?
Отделяйте диагностику и журналы от вывода программы с помощью потоков cerr и clog. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Работа с std::cerr и std::clog»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Корректное использование std::cin и std::cout
- Форматирование вывода с iomanip
- Безопасное чтение ввода с помощью getline
- Работа с std::cerr и std::clog