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从文件交换,但我认为这是一个死胡同,因为它没有赶上什么,似乎挺表现不佳.
笔记
让我举一个玩具示例来说明.考虑以下MATLAB函数:
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)
正确处理键盘输入的位置.
原来是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)
| 归档时间: |
|
| 查看次数: |
2952 次 |
| 最近记录: |