windows - 使用标准 io 流 :stdin and stdout in a matlab exe

标签 windows matlab stdout stdin matlab-compiler

问题

我希望它“监听”正在运行(已编译)的 Matlab 可执行文件中的标准输入流。

我相信这是用 c 或类似语言完成的:

#include stdio.h
fgets(line, 256, stdin)

或者更详细地说,它可以这样使用:

if (!fgets(line, 256, stdin))
    return;
if (line[0] == '\n')
    continue;
sscanf(line, "%s", command);

回答

为了完整起见,我将完整地保留背景和注释,但在 Amro 和 EitanT 的帮助下,我已经设法解决了。

背景

我已经找到了如何用其他语言做到这一点,并且 here是编译过程的一些说明。

但是,我还没有在任何地方找到如何“收听”Matlab 中的输入。 我最接近的是this description Octave 中类似 C 的 IO,但我在 MATLAB 中寻找解决方案时无法取得进展。

请注意,改变或包装通过流发送数据的程序是不可能的,而且我更喜欢纯 MATLAB 解决方案而不是包装我的整个程序。如果我用另一种语言从 MATLAB 调用一个简单的函数,那没问题。

我尝试了什么?

我尝试命令窗口中的一些函数,如fgets(0)(fid = 0 似乎是对应于stdin(如@EitanT 所述,并在尝试 fopen(0)) 时看到)但它只是返回:

Operation is not implemented for requested file identifier.

我也考虑过使用 MATLAB 中的选项来调用系统命令或执行 java/perl 命令,但到目前为止还没有成功。我也不确定这些在编译后是否仍然有效。

此外,我尝试使用 input('prompt','s') 这在我通过 cmd 打开程序时有效,但是在我按下回车键之前什么都不做。 (我听的程序当然不会这样做,在最好的情况下我可以在每行的末尾得到 \n)。

我也尝试了 waitinput 来自File Exchange但我认为这是一个死胡同,因为它没有捕捉到任何东西,而且表现似乎很差。

注意事项

  1. 我使用的是 Windows 7 和 MATLAB 2012b。
  2. 我找到了popen on File Exchange但这似乎不适用于 Windows。
  3. 当我简单地键入诸如 'show me' 之类的内容时,它会正确地发送到标准输出流。

最佳答案

让我用一个玩具示例来说明。考虑以下 MATLAB 函数:

打招呼.m

function greet()
    str = input('Enter your name: ','s');
    fprintf('Hello %s\n',str)
end

现在让我们将它编译成一个独立的应用程序。请注意,如果您使用 deploytool 工具,请确保选择“控制台应用程序”而不是“Windows 独立应用程序”作为目标。后者显然会生成一个可执行文件,其中标准输入连接到系统外壳而不是 MATLAB 命令提示符。

deploytool

如果您更喜欢自己直接编译,请使用以下调用:

mcc -o hello -W main:hello -T link:exe -N -v greet.m

(作为引用,“Windows 应用程序”目标问题是 -W WinMain:hello)

运行可执行文件产生:

C:\> hello
Enter your name: Amro
Hello Amro

正确处理键盘输入的地方。

关于windows - 使用标准 io 流 :stdin and stdout in a matlab exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16775996/

相关文章:

c++ - 如何以编程方式将控制台字体设置为光栅字体?

java - Windows:启动一个隐藏的新进程(无窗口)

matlab - 我如何在 Eigen 应用类似 bsxfun 的功能?

command-line - Adobe AIR 应用程序能否通过命令行输出到控制台运行?

Python3 http.server : save log to a file

Windows XP x86 检查版本?

r - install_github (“bmschmidt/wordVectors”)

MATLAB:数据点无法连接?

matlab - 我可以及时向后运行 ode45 吗?

Matlab:抑制fmincon的标准输出?