Я разрабатываю визуальный движок, и я использую следующие две вещи в качестве замены стандартного ввода/вывода между ПК и пользователем, которые вы получаете в консольном приложении.
1: Использовать sprintf
(int sprintf (char * str, const char * format, ...))
. То, что он делает, это печатать в строку вместо stdout (вам не нужно использовать временный файл). После этого вы можете использовать MessageBox
со строкой, на которой вы только что напечатали.
2: Сделайте фактическое окно консоли (при сохранении основного) и перенаправьте stdin
, stdout
и stderr
из главного окна на консоль. Вот класс для строительства:
ConsoleWindowClass.h:
#pragma once
#include <windows.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <iostream>
#include <fstream>
class ConsoleWindowClass
{
public:
ConsoleWindowClass(void);
~ConsoleWindowClass(void);
void Create();
};
ConsoleWindowClass.cpp:
#include "ConsoleWindowClass.h"
using namespace std;
// maximum mumber of lines the output console should have
static const WORD MAX_CONSOLE_LINES = 500;
ConsoleWindowClass::ConsoleWindowClass(void)
{
Create();
}
ConsoleWindowClass::~ConsoleWindowClass(void)
{
}
void ConsoleWindowClass::Create()
{
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();
}
После этого вызова printf()
напечатает строку в консоли. Вы также можете использовать консоль для ввода строк в нее, и они будут использоваться из главного окна (используйте многопоточность, чтобы scanf
не остановил вашу основную программу).
Технически это не писать где угодно, но вы можете перенаправить его в текстовый файл, используя 'freopen («file.txt»,«ж», стандартный вывод) ; ' – Predelnik
возможный дубликат [Как я могу перенаправить stdout на какой-либо видимый экран в приложении Windows?] (Http://stackoverflow.com/questions/573724/how-can-i-redirect-stdout-to-some-visible -display-in-a-windows-приложение) –
@MartinR :: Я не хочу перенаправлять вывод. Я хочу знать, где он пишет, если не перенаправлен, и есть способ прочитать это местоположение для проверки. – Abhineet