【发布时间】:2013-05-22 11:26:27
【问题描述】:
问题
我希望它在运行(已编译)的 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 中的输入。 我最接近的是 Octave 中类似 C 的 IO 的 this description,但是当我在 MATLAB 中寻找解决方案时,我无法在这方面取得进展。
请注意,更改或包装通过流发送数据的程序是不可能的,我更喜欢纯 MATLAB 解决方案,而不是包装我的整个程序。如果我用不同的语言从 MATLAB 中调用一个简单的函数,那就没问题了。
我尝试了什么?
我尝试了命令窗口中的一些函数,例如 fgets(0)(fid = 0 似乎是对应于 stdin 的 id(如 @EitanT 所述,并在尝试 fopen(0) 时看到) ) ) 但它只是返回:
Operation is not implemented for requested file identifier.
我也考虑过使用 MATLAB 中的选项来调用系统命令或执行 java / perl 命令,但到目前为止没有运气。我也不确定这些在编译后是否仍然有效。
此外,我尝试使用input('prompt','s'),这在我通过cmd 打开程序时有效,但在我按Enter 之前什么都不做。 (这当然是我听的程序永远不会做的,在最好的情况下我可以在每一行的末尾得到\n)。
我也尝试过 waitinput from File Exchange,但我认为这是一个死胡同,因为它没有捕获任何东西,而且似乎表现很差。
备注
- 我使用的是 Windows 7 和 MATLAB 2012b。
- 我找到了
popenon File Exchange,但这似乎不适用于 Windows。 - 当我简单地键入
'show me'之类的内容时,它会正确发送到标准输出流。
【问题讨论】:
-
您为什么不直接使用 MATLAB Compiler 创建共享库而不是独立应用程序。这样,您就可以构建自己的 C/C++ 程序,该程序像往常一样与标准输入/输出交互并链接到生成的 MATLAB 库。顺便说一句,您链接到的 pdf 文档非常过时。这是最新的:mathworks.com/help/pdf_doc/compiler/compiler.pdf
-
我必须说不清楚你的问题是什么。所以让我弄清楚;您正在尝试使用已编译的 MATLAB 应用程序中的
input函数,但它不起作用。是这样吗? -
@DennisJaheruddin 不如编写一个 MEX 程序,而不是使用 MATLAB 的内置
input()需要点击“enter”键来提交输入? -
@EitanT 显然缺乏回车并不是问题的根源。我已经提出了一个答案,但当然仍然欢迎 cmets。感谢您的帮助!
标签: windows matlab stdout stdin matlab-compiler