Захват cout в окне вывода Visual Studio 2005?

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

Правильный ответ был дан здесь: stackoverflow.com/a/2518683/6547185 и с конкретным cmake здесь: stackoverflow.com/a/53886628/6547185

mr NAE 01.02.2019 11:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
1
15 541
7

Ответы 7

Вы не можете этого сделать.

Если вы хотите выводить данные в окно вывода отладчика, вызовите OutputDebugString.

Я нашел эта реализация «teestream», который позволяет одному выходу идти в несколько потоков. Вы можете реализовать поток, который отправляет данные в OutputDebugString.

Это случай, когда экран вывода просто мигает, а затем исчезает? если это так, вы можете оставить его открытым, используя cin в качестве последнего оператора перед возвратом.

Нет, нельзя, потому что оценка cin сама по себе не имеет никакого эффекта.

ben 17.09.2008 01:20

Вы можете записать вывод 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, как упомянул Майк Диммик.

jwfearn 26.09.2008 17:58

Комбинация ответа Бена и Майка Диммика: вы должны реализовать 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 или что-то в этом роде.

Malvineous 19.01.2015 02:38

Напишите в std :: ostringsteam, а затем ОТСЛЕЖИВАЙТЕ это.

std::ostringstream oss;

oss << "w: = " << w << " u = " << u << " vt = " << vt << endl;

TRACE(oss.str().data());

Другие вопросы по теме