如何通过R调用Fortran可执行文件并实现输入文件交互
问题根因
你遇到的两个报错分别对应两个核心错误:
- 你的Fortran程序是从标准输入(控制台交互)读取输入文件名,而非读取命令行参数,所以直接将
Psib_future.IN作为参数传给system2程序无法识别,会持续等待控制台输入直到读取到EOF,触发你看到的Fortran end-of-file报错 - 后续的shell命令存在语法错误:括号未闭合,且逻辑错误,你需要将输入文件名传给exe程序,而非先输出exe本身的名称
解决方案
方案1:自动传入输入文件名(无需手动交互,推荐)
直接用system2的input参数将交互内容按行传给程序的标准输入,不需要用户手动输入,操作步骤如下:
- 先切换工作目录到exe所在文件夹,避免路径匹配问题
setwd("C:/Users/S. Sundar/Downloads")
- 调用
system2传入输入内容
system2("psibtflCT.exe", input = "Psib_future.IN", stdout = "", stderr = "")
如果程序后续还有其他交互输入项,只需要把所有要输入的内容按顺序拼成字符向量传给input参数即可,示例:input = c("Psib_future.IN", "第二个输入值", "第三个输入值")
方案2:触发手动交互窗口输入
如果确实需要手动输入内容,让程序弹出独立的控制台窗口显示输入提示,可使用如下命令:
setwd("C:/Users/S. Sundar/Downloads") # 弹出独立cmd窗口运行程序,会正常显示交互提示,等待手动输入 system2("cmd.exe", args = c("/c", "start", "psibtflCT.exe"), wait = FALSE)
运行后会弹出新的cmd窗口,按提示输入Psib_future.IN回车即可完成交互。
之前shell命令的修正写法
你之前的shell命令除了语法错误,逻辑上也应该用管道将输入内容传给exe,修正后可运行的写法如下:
shell("cd C:\\Users\\S. Sundar\\Downloads && echo Psib_future.IN | psibtflCT.exe", intern = TRUE)
该写法效果和方案1一致,但不如直接用system2的input参数兼容性好。
内容的提问来源于stack exchange,提问作者user2450223
相关产品推荐
相关产品推荐

