Я создал консольное приложение C++ и просто хочу сохранить операторы cout / cerr в окне вывода в среде IDE Visual Studio 2005. Я уверен, что это просто параметр, который мне не хватает. Может кто-то указать мне верное направление?





Вы не можете этого сделать.
Если вы хотите выводить данные в окно вывода отладчика, вызовите OutputDebugString.
Я нашел эта реализация «teestream», который позволяет одному выходу идти в несколько потоков. Вы можете реализовать поток, который отправляет данные в OutputDebugString.
Это случай, когда экран вывода просто мигает, а затем исчезает? если это так, вы можете оставить его открытым, используя cin в качестве последнего оператора перед возвратом.
Нет, нельзя, потому что оценка cin сама по себе не имеет никакого эффекта.
Вы можете записать вывод cout, например, следующим образом:
std::streambuf* old_rdbuf = std::cout.rdbuf();
std::stringbuf new_rdbuf;
// replace default output buffer with string buffer
std::cout.rdbuf(&new_rdbuf);
// write to new buffer, make sure to flush at the end
std::cout << "hello, world" << std::endl;
std::string s(new_rdbuf.str());
// restore the default buffer before destroying the new one
std::cout.rdbuf(old_rdbuf);
// show that the data actually went somewhere
std::cout << s.size() << ": " << s;
Помещение его в окно вывода Visual Studio 2005 оставлено в качестве упражнения для разработчика подключаемого модуля Visual Studio 2005. Но вы, вероятно, могли бы перенаправить его в другое место, например, в файл или настраиваемое окно, возможно, написав собственный класс streambuf (см. Также boost.iostream).
Плагин не требуется, просто используйте OutputDebugString, как упомянул Майк Диммик.
Комбинация ответа Бена и Майка Диммика: вы должны реализовать stream_buf_, который в конечном итоге вызывает OutputDebugString. Может, кто-то это уже делал? Взгляните на две предлагаемые библиотеки ведения журнала Boost.
Кроме того, в зависимости от ваших намерений и используемых вами библиотек, вы можете захотеть использовать Макрос TRACE (MFC) или АТЛТРАС (ATL).
Я наконец-то реализовал это, поэтому хочу поделиться с вами:
#include <vector>
#include <iostream>
#include <windows.h>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/tee.hpp>
using namespace std;
namespace io = boost::iostreams;
struct DebugSink
{
typedef char char_type;
typedef io::sink_tag category;
std::vector<char> _vec;
std::streamsize write(const char *s, std::streamsize n)
{
_vec.assign(s, s+n);
_vec.push_back(0); // we must null-terminate for WINAPI
OutputDebugStringA(&_vec[0]);
return n;
}
};
int main()
{
typedef io::tee_device<DebugSink, std::streambuf> TeeDevice;
TeeDevice device(DebugSink(), *cout.rdbuf());
io::stream_buffer<TeeDevice> buf(device);
cout.rdbuf(&buf);
cout << "hello world!\n";
cout.flush(); // you may need to flush in some circumstances
}
БОНУСНЫЙ СОВЕТ: Если вы напишете:
X:\full\file\name.txt(10) : message
в окно вывода, а затем дважды щелкните по нему, тогда Visual Studio перейдет к заданному файлу, строка 10, и отобразит «сообщение» в строке состояния. Это очень полезно.
У меня это работает очень хорошо, но с VS2013 и Boost 1.57 он вылетает с ошибкой утверждения в коде Boost, как только поток сбрасывается, либо путем печати много, либо путем отправки std::endl в поток, так что это больше не можно использовать :-( Не уверен, что это ошибка в Boost или что-то в этом роде.
Напишите в std :: ostringsteam, а затем ОТСЛЕЖИВАЙТЕ это.
std::ostringstream oss;
oss << "w: = " << w << " u = " << u << " vt = " << vt << endl;
TRACE(oss.str().data());
Правильный ответ был дан здесь: stackoverflow.com/a/2518683/6547185 и с конкретным cmake здесь: stackoverflow.com/a/53886628/6547185