Как получить вывод консоли на C ++ с помощью программы Windows?

Это использование в net / internal. Вероятно, вы импортируете сеть в свой проект в каком-либо проекте и, таким образом, выполняете незаконный импорт.

Если вы ограничиваете свое использование net / http в проекте движка приложения, вы должны быть в порядке.

30
задан Rob 11 January 2009 в 18:08
поделиться

5 ответов

Выезд Добавляющий Консольный ввод-вывод к Приложению для GUI Win32. Это может помочь Вам сделать то, что Вы хотите.

, Если Вы не имеете или не можете изменить код, пробуют предложения, найденные здесь для перенаправления консольного вывода в файл.

<час>

Редактирование: бит некромантии потока здесь. Я сначала ответил на это 9ish несколько лет назад в первые годы Так, прежде чем (хорошая) политика ответов non-link-only вошла в силу. Я повторно отправлю код от исходной статьи в надежде искупить мои прошлые грехи.

guicon.cpp - консольная функция перенаправления

#include <windows.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <iostream>
#include <fstream>
#ifndef _USE_OLD_IOSTREAMS
using namespace std;
#endif
// maximum mumber of lines the output console should have
static const WORD MAX_CONSOLE_LINES = 500;
#ifdef _DEBUG
void RedirectIOToConsole()
{
    int hConHandle;
    long lStdHandle;
    CONSOLE_SCREEN_BUFFER_INFO coninfo;
    FILE *fp;

    // allocate a console for this app
    AllocConsole();

    // set the screen buffer to be big enough to let us scroll text
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
    coninfo.dwSize.Y = MAX_CONSOLE_LINES;
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);

    // redirect unbuffered STDOUT to the console
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen( hConHandle, "w" );
    *stdout = *fp;
    setvbuf( stdout, NULL, _IONBF, 0 );

    // redirect unbuffered STDIN to the console
    lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen( hConHandle, "r" );
    *stdin = *fp;
    setvbuf( stdin, NULL, _IONBF, 0 );

    // redirect unbuffered STDERR to the console
    lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen( hConHandle, "w" );
    *stderr = *fp;
    setvbuf( stderr, NULL, _IONBF, 0 );

    // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
    // point to console as well
    ios::sync_with_stdio();
}

#endif
//End of File

guicon.h - Интерфейс для консольного подключения к функции перенаправления

#ifndef __GUICON_H__
#define __GUICON_H__
#ifdef _DEBUG

void RedirectIOToConsole();

#endif
#endif

// End of File

test.cpp - перенаправление консоли Demonstrating

#include <windows.h>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <stdio.h>
#ifndef _USE_OLD_OSTREAMS
using namespace std;
#endif
#include "guicon.h"


#include <crtdbg.h>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    #ifdef _DEBUG
    RedirectIOToConsole();
    #endif
    int iVar;

    // test stdio
    fprintf(stdout, "Test output to stdout\n");
    fprintf(stderr, "Test output to stderr\n");
    fprintf(stdout, "Enter an integer to test stdin: ");
    scanf("%d", &iVar);
    printf("You entered %d\n", iVar);

    //test iostreams
    cout << "Test output to cout" << endl;
    cerr << "Test output to cerr" << endl;
    clog << "Test output to clog" << endl;
    cout << "Enter an integer to test cin: ";
    cin >> iVar;
    cout << "You entered " << iVar << endl;
    #ifndef _USE_OLD_IOSTREAMS

    // test wide iostreams
    wcout << L"Test output to wcout" << endl;
    wcerr << L"Test output to wcerr" << endl;
    wclog << L"Test output to wclog" << endl;
    wcout << L"Enter an integer to test wcin: ";
    wcin >> iVar;
    wcout << L"You entered " << iVar << endl;
    #endif

    // test CrtDbg output
    _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR );
    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR);
    _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDERR);
    _RPT0(_CRT_WARN, "This is testing _CRT_WARN output\n");
    _RPT0(_CRT_ERROR, "This is testing _CRT_ERROR output\n");
    _ASSERT( 0 && "testing _ASSERT" );
    _ASSERTE( 0 && "testing _ASSERTE" );
    Sleep(2000);
    return 0;
}

//End of File
21
ответ дан luke 11 January 2009 в 18:08
поделиться
  • 1
    Иоганнес спасибо, очень простой и это работает. – Stephen Drew 11 February 2014 в 13:42

Можно также вновь открыть суд и cerr потоки для вывода в файл также. Следующее должно работать на это:

#include <iostream>
#include <fstream>

int main ()
{
    std::ofstream file;
    file.open ("cout.txt");
    std::streambuf* sbuf = std::cout.rdbuf();
    std::cout.rdbuf(file.rdbuf());
    //cout is now pointing to a file
    return 0;
}
9
ответ дан AntonyG 11 January 2009 в 18:08
поделиться
  • 1
    Между прочим, WindowStartupLocation только влияет на начальные значения для свойств Top и Left окна, когда это открыто; это не влияет на порядок Z. – Sylvain 31 March 2010 в 14:04

Не заключайте мне в кавычки на этом, но консоль API Win32 могла бы быть тем, что Вы ищете. Если Вы просто делаете это для отладки целей, однако, Вы могли бы больше интересоваться выполнением DebugView и вызов функция DbgPrint.

Это, конечно, принимает его Ваше заявление, которое Вы хотите послать консольному выводу, не читая его из другого приложения. В этом случае каналы могли бы быть Вашим другом.

2
ответ дан Chris Charabaruk 11 January 2009 в 18:08
поделиться
  • 1
    @BurakYeniç eri 9 лет спустя.... Я don' t знают. Тогда я пришел к заключению, что это не было возможно после большого количества попыток. Намного более поздний Johannes предложил решение, которое имеет много upvotes, я предполагаю it' s хорошее решение. I' ve очистил " accept" на моем собственном ответе. – Sylvain 12 June 2019 в 20:39

С тех пор нет никакой консоли, это <ударяют> невозможный трудный. (Изучайте что-то новое каждый день - я никогда не знал о консольных функциях!)

для Вас действительно ли возможно заменить Ваши выходные вызовы? Я буду часто использовать ТРАССИРОВКУ или OutputDebugString для отправки информации в окно вывода Visual Studio.

0
ответ дан Mark Ransom 11 January 2009 в 18:08
поделиться
  • 1
    Я can' t устанавливают свойство Owner, потому что в моем случае, окно создается перед любыми другими окнами. Поэтому я don' t имеют любое другое окно для установки как владелец. – Sylvain 31 March 2010 в 13:38

создание канала, выполните консоль CreateProcess программы () и читайте с ReadFile () или записи в консоли WriteFile ()

    HANDLE hRead ; // ConsoleStdInput
    HANDLE hWrite; // ConsoleStdOutput and ConsoleStdError

    STARTUPINFO           stiConsole;
    SECURITY_ATTRIBUTES   segConsole;
    PROCESS_INFORMATION   priConsole;

    segConsole.nLength = sizeof(segConsole);
    segConsole.lpSecurityDescriptor = NULL;
    segConsole.bInheritHandle = TRUE;

if(CreatePipe(&hRead,&hWrite,&segConsole,0) )
{

    FillMemory(&stiConsole,sizeof(stiConsole),0);
    stiConsole.cb = sizeof(stiConsole);
GetStartupInfo(&stiConsole);
stiConsole.hStdOutput = hWrite;
stiConsole.hStdError  = hWrite;
stiConsole.dwFlags    = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
stiConsole.wShowWindow = SW_HIDE; // execute hide 

    if(CreateProcess(NULL, "c:\\teste.exe",NULL,NULL,TRUE,NULL,
      NULL,NULL,&stiConsole,&priConsole) == TRUE)
    {
        //readfile and/or writefile
}    

}

3
ответ дан 12 January 2009 в 04:08
поделиться
  • 1
    итак, почему не только используют WindowStartupLocation =" CenterScreen" – paradisonoir 1 April 2010 в 00:41
Другие вопросы по тегам:

Похожие вопросы: