Почему перенаправление вывода утверждения() работает, когда оно выполняется с использованием freopen() и stderr, но не п ⇐ C++
Почему перенаправление вывода утверждения() работает, когда оно выполняется с использованием freopen() и stderr, но не п
Я хотел бы перенаправить вывод, который assert() создает в случае сбоя утверждения, чтобы он записывался в файл журнала, а не в окно вывода. Я предполагал, что assert() использует std::cerr для вывода, но при перенаправлении std::cerr в мой файл журнала assert( ) по-прежнему выводится в окно вывода, а не в мой файл:
std::ofstream ofs("log-file.txt"); std::cerr.rdbuf(ofs.rdbuf()); утверждать (ложь); // По-прежнему выводит «Утверждение не выполнено: false» в окно вывода, а не в файл журнала Я нашел вопрос SO с похожей проблемой, и в ответе на него было предложено вместо этого использовать freopen, вот так:
freopen("log-file.txt", "w", stderr); Это выдает ошибку: 'freopen': Эта функция или переменная могут быть небезопасными. Вместо этого рассмотрите возможность использования freopen_s.
Кажется,
freopen_s принимает другие аргументы, чем freopen, и я не могу заставить его работать.
В другом ответе SO предлагалось использовать freopen, но просто добавить _CRT_SECURE_NO_WARNINGS в командную строку в свойствах проекта Visual Studio. Это действительно устранило ошибку, и assert() теперь правильно выводится в мой файл журнала.
Но все это кажется излишне сложным. Такое ощущение, что должен быть плавный способ добиться того, чего я хочу, без подавления предупреждений компилятора уровня 3. Почему я не могу просто нормально перенаправить буфер того, что assert() использует для вывода? Что именно assert() использует для вывода, если это не std::cout, std::cerr или std::clog? (Я пробовал перенаправить все три)
Я хотел бы перенаправить вывод, который assert() создает в случае сбоя утверждения, чтобы он записывался в файл журнала, а не в окно вывода. Я предполагал, что assert() использует std::cerr для вывода, но при перенаправлении std::cerr в мой файл журнала assert( ) по-прежнему выводится в окно вывода, а не в мой файл:
std::ofstream ofs("log-file.txt"); std::cerr.rdbuf(ofs.rdbuf()); утверждать (ложь); // По-прежнему выводит «Утверждение не выполнено: false» в окно вывода, а не в файл журнала Я нашел вопрос SO с похожей проблемой, и в ответе на него было предложено вместо этого использовать freopen, вот так:
freopen("log-file.txt", "w", stderr); Это выдает ошибку: 'freopen': Эта функция или переменная могут быть небезопасными. Вместо этого рассмотрите возможность использования freopen_s.
Кажется,
freopen_s принимает другие аргументы, чем freopen, и я не могу заставить его работать.
В другом ответе SO предлагалось использовать freopen, но просто добавить _CRT_SECURE_NO_WARNINGS в командную строку в свойствах проекта Visual Studio. Это действительно устранило ошибку, и assert() теперь правильно выводится в мой файл журнала.
Но все это кажется излишне сложным. Такое ощущение, что должен быть плавный способ добиться того, чего я хочу, без подавления предупреждений компилятора уровня 3. Почему я не могу просто нормально перенаправить буфер того, что assert() использует для вывода? Что именно assert() использует для вывода, если это не std::cout, std::cerr или std::clog? (Я пробовал перенаправить все три)
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему, когда я пишу в stderr, я вижу вывод STDERR на стандартном выводе?
Anonymous » » в форуме Python - 0 Ответы
- 29 Просмотры
-
Последнее сообщение Anonymous
-