如何从 Windows 应用程序输出到标准输入?

Posted

技术标签:

【中文标题】如何从 Windows 应用程序输出到标准输入?【英文标题】:How to output to stdin from a Windows application? 【发布时间】:2018-10-24 18:32:47 【问题描述】:

这是我的代码的 sn-p:

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.

显然这里控制台的使用是基本的,但这应该可以解决这个问题。问题是cinscanf 之类的功能不起作用。 coutcerrclogprintf 工作正常,但输入函数没有做任何事情。如何使stdin 工作(最好使用cin)?

【问题讨论】:

你在freopen()流媒体之后尝试过std::cin.clear()吗? 你为什么不用Unicode @J.在freopen("CONIN$", "r", stdin) 之后添加cin.clear() 不起作用。 @stackptr 我不需要 Unicode,我不明白为什么这与这个问题有关 您可以尝试与freopen() 文章中描述的freopen() 不同的方法。 【参考方案1】:

您的/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 才能在 x64 Windows 上以这种方式工作。尝试使用 x86 可执行文件会给出有趣的错误消息。)

有关该主题的讨论,请参阅 How do I write a program that can be run either as a console or a GUI application?。

【讨论】:

它说_O_TEXT 未定义 _O_TEXT 定义在&lt;fcntl.h&gt; 我从 WinMain 调用它并检查返回值是否为 false。如果是,则显示一个 Windows 消息框,否则不显示。当没有控制台启动时,它会显示(显然),但是当使用控制台启动时,它不会显示,但标准输入和标准输出都不起作用。 你检查你的AttachConsole(-1);的返回值吗?到底什么是父进程? 是的,我查过了,只有在实际有调用控制台时才返回TRUE

以上是关于如何从 Windows 应用程序输出到标准输入?的主要内容,如果未能解决你的问题,请参考以下文章

如何将标准输入重定向到 Windows 命令行中的文件?

如何将变量作为标准输入从 PHP 传递到命令行

Python子进程将数据定向到标准输入

如何在 Windows 上的 CreateProcess() 中不继承标准输入、标准输出和标准错误

编写一个从标准输入读取并打印到标准输出的 c 程序,没有内置的行长限制

如何将标准输出重定向到 Windows 应用程序中的某个可见显示?