Visual Studio - Как я могу видеть вывод cout в неконсольном приложении?
Кажется довольно утомительным вывод в окно отладки. Где я могу найти вывод cout
, если я пишу не-консольную информацию?
Вроде:
double i = a / b;
cout << b << endl;//I want to check out whether b is zero. It seems the output cannot be found anywhere.
Ответы
Ответ 1
Чтобы вывести строку на консоль отладки, используйте OutputDebugStringA
. См. http://msdn.microsoft.com/en-us/library/windows/desktop/aa363362%28v=vs.85%29.aspx
Чтобы вывести значения переменных в консоль отладки, используя std::ostringstream
, отправьте строку в OutputDebugStringA
.
Чрезмерные операторы вывода заставят программу сильно замедлить работу. Тем не менее, это хорошая техника, чтобы поймать вещи, с которыми имеет проблемы отладчик, такие как фактические дочерние элементы при игре с базовыми указателями.
Ответ 2
Вопрос очень ясен. Как использовать std:: cout для отладки не консольного приложения в Visual Studio.
Ответ очень ясен: вы не можете. То есть Visual Studio не поддерживает std:: cout в качестве инструмента отладки для неконсольных приложений.
Это серьезное ограничение для Visual Studio, возможно, даже не соответствует стандарту С++. Мне очень грустно видеть дезинформативные "ответы" здесь, пытаясь скрыть этот недостаток их драгоценной Visual Studio.
Ответ 3
Для решения Windows вы можете выделить консоль и связать cout/cin с ней. Например:
AllocConsole();
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
Документация:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms681944%28v=vs.85%29.aspx
Ответ 4
Вместо использования cout создайте файл журнала и напишите в нем что угодно.
Изменить:
Используйте этот простой код для записи в файл журнала.
ofstream log;
log.open ("log.txt");
log << "Writing this to a file.\n";
log.close();
Ответ 5
Этот ответ решает вопрос и позволяет перенаправить вывод консоли в окно вывода Visual Studio.
Сначала нам нужен класс, который переопределяет поток строк cout по умолчанию:
class dbg_stream_for_cout
: public std::stringbuf
{
public:
~dbg_stream_for_cout() { sync(); }
int sync()
{
::OutputDebugStringA(str().c_str());
str(std::string()); // Clear the string buffer
return 0;
}
};
dbg_stream_for_cout g_DebugStreamFor_cout;
Затем где-то вы хотите "активировать" запись в окно вывода VS:
std::cout.rdbuf(&g_DebugStreamFor_cout); // Redirect std::cout to OutputDebugString!
Ответ 6
Просто используйте std:: cin.get() в конце вашего кода, например:
std::cout << "print this" << std::endl;
std::cin.get();
Это заставляет программу оставаться открытой и ждать ввода пользователя.
Работает для меня в любом случае. Кредит отправляется в TheChernoProject: https://www.youtube.com/channel/UCQ-W1KE9EYfdxhL6S4twUNw
Ответ 7
Я бы хотел дать 2 цента.
Учитывая, что, возможно, это проблема VS о совместимости со стандартом С++ или что мы можем использовать OutputDebugStringA
, если вы не можете изменить свою базу кода, вам может понравиться идея просто перенаправить std:: cout на что-то другое, как файл.
Итак, без изменения базы кода вы можете сделать что-то вроде предложенного здесь: Как перенаправить cin и cout в файлы?
Сгущенное:
- добавить include
#include <fstream>
- в начале вашего приложения в некоторых init перед регистрацией вы можете использовать:
std::ofstream out("out.txt");
std::streambuf *coutbuf = std::cout.rdbuf(); //save old buf
std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!
- в конце вашего приложения/регистрации:
станд:: cout.rdbuf(coutbuf);// reset для стандартного вывода снова
Надеюсь, это поможет кому-то, Kudos to Nawaz, который предоставил ответ в другом потоке.