5

问题

我希望它在运行(编译)的 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 的帮助下,我设法解决了问题。

背景

我已经找到了如何用其他语言做到这一点,这里有一些关于编译过程的说明。

但是,我还没有找到如何在 Matlab 中“收听”输入的方法。我最接近的是在 Octave 中对类 C IO 的描述,但是当我在 MATLAB 中寻找解决方案时,我无法在这方面取得进展。

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

我尝试了什么?

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

Operation is not implemented for requested file identifier.

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

此外input('prompt','s'),当我通过 打开程序时,我尝试使用此作品cmd,但直到我按 Enter 键才执行任何操作。(我听的程序当然永远不会这样做,在最好的情况下,我可以\n在每一行的末尾得到)。

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

笔记

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

2 回答 2

5

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

问候.m

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

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

部署工具

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

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

正确处理来自键盘的输入。

于 2013-05-29T17:07:18.710 回答
3

原来是input读取标准输入流。

我未能收集输入的原因是因为我使用它如下:

input('prompt','s')

结果,字符串'prompt'被发送到调用我的应用程序的程序,并且由于它认为这是一个无效的响应/请求,它没有发送任何东西。

我已经成功地制作了一个小型测试程序,并且不像我之前怀疑的那样,其他应用程序在发送命令后没有按回车不是问题。

一般解决方案

这是我当前设置的方式,

while 1
   stdin = input('','s'); % Note the empty first argument
   if ~isempty(stdin)
    stdout = process_input(stdin);
    stdout % Displaying the result (And thus sending it to stdout)
   end
end
于 2013-05-30T19:21:56.000 回答