Как вывести на стандартный ввод из приложения Windows? - PullRequest
0 голосов
/ 24 октября 2018

Это фрагмент моего кода:

AttachConsole(-1);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
freopen("CONIN$", "r", stdin); //this doesn't seem to do anything
int n = 0;
cin >> n;
cout << n + 1;
FreeConsole();
WNDCLASSA MainWindow = { 0 };
MainWindow.hbrBackground = (HBRUSH) COLOR_WINDOW;
MainWindow.hCursor = LoadCursor(NULL, IDC_ARROW);
MainWindow.hInstance = hInst;
//here the window gets created etc.

Очевидно, что использование консоли здесь является базовым, но это должно сделать для этого вопроса.Проблема в том, что такие функции, как cin или scanf не работают.cout, cerr, clog, printf работают нормально, но функции ввода ничего не делают.Как я могу заставить stdin работать (желательно с cin)?

1 Ответ

0 голосов
/ 24 октября 2018

Ваша /SUBSYSTEM:WINDOWS программа будет отсоединена от консоли прямо при ее запуске, и командный процессор cmd.exe снова ожидает ввода данных пользователем.Таким образом, stdin уже используется, прежде чем ваша программа сможет выполнить какую-либо операцию ввода.

На самом деле,

#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>

#include <iostream>

int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    AttachConsole(-1);

    freopen("CONOUT$", "w", stdout);
    freopen("CONOUT$", "w", stderr);
    freopen("CONIN$", "r", stdin);

    std::cout.clear();
    std::cin.clear();

    std::cout << "Hello!\n";
    int i;
    std::cin >> i;
    std::cout << i << '\n';
    std::cin.get();
    std::cin.get();
}

работает, как и ожидалось, при запуске из командной строки с использованием start /wait foobar.exe.(foobar.exe должен быть построен как x64, чтобы работать таким образом в Windows x64. Попытка использования исполняемого файла x86 приводит к забавным сообщениям об ошибках.)

См. Как написать программу, которая может быть запущена какконсоль или приложение с графическим интерфейсом? для обсуждения темы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...