使用标准的io流:在matlab exe中使用stdin和stdout

Den*_*din 5 windows matlab stdin stdout matlab-compiler

我希望它在运行(编译)的Matlab可执行文件中"监听"标准输入流.

这就是我相信它是c用相同的语言完成的:

#include stdio.h
fgets(line, 256, stdin)
Run Code Online (Sandbox Code Playgroud)

或者更精细的是,它可以这样使用:

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

回答

为了完整起见,我将完整地留下背景和笔记,但在Amro和EitanT的帮助下,我已经设法解决了问题.

背景

我已经找到了如何做到这一点其他语言,并在这里是在编译过程中的一些指令.

但是,我还没有找到如何在Matlab中"监听"输入.我最接近的是Octave中对C-like IO的描述,但是当我在MATLAB中寻找解决方案时,我无法取得进展.

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

我试过了什么?

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

Operation is not implemented for requested file identifier.
Run Code Online (Sandbox Code Playgroud)

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

此外,input('prompt','s')当我打开程序时,我尝试使用此作品cmd,但在我按下回车之前没有做任何事情.(当然我听的节目永远都不会做,最好的情况是我可以\n在每一行结尾处获得).

我也尝试了 waitinput文件交换,但我认为这是一个死胡同,因为它没有赶上什么,似乎挺表现不佳.

笔记

  1. 我使用的是Windows 7和MATLAB 2012b.
  2. popen 在文件交换中找到了,但似乎不适用于Windows.
  3. 当我只是键入类似'show me'这样的东西时,将其正确发送到标准输出流.

Amr*_*mro 5

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

greet.m

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

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

部署工具

如果您希望自己直接编译它,请使用以下调用:

mcc -o hello -W main:hello -T link:exe -N -v greet.m
Run Code Online (Sandbox Code Playgroud)

(作为参考,"Windows应用程序"目标问题-W WinMain:hello)

运行可执行文件产生:

C:\> hello
Enter your name: Amro
Hello Amro
Run Code Online (Sandbox Code Playgroud)

正确处理键盘输入的位置.


Den*_*din 3

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

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

input('prompt','s')
Run Code Online (Sandbox Code Playgroud)

结果,该字符串'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
Run Code Online (Sandbox Code Playgroud)

  • 问题在于 Matlab 编译器想要创建一个指向字符串的指针,而该字符串并未真正创建。我可以用“input(char(0),'s');”来规避这种变暖。(一些信息http://compgroups.net/comp.soft-sys.matlab/string-ascii-null/806917) (2认同)