Windows命令行使用管道为Fortran可执行程序传多组输入失败如何解决
Fortran Windows管道多组输入传入问题
问题描述
我有一个Fortran可执行程序,在执行计算前需要接收多次键盘输入,直接在终端手动输入参数可正常运行,但我希望在Windows 10命令行中使用管道传入这些输入。目前仅需单组输入时管道可以正常工作,传入多组输入时就会报错,请问如何解决该问题?
我参考了相关社区类似问题,也查阅了标准输入相关文档,但依然没有找到解决方案。
单组输入正常的示例程序
以下是仅需单组输入的Fortran示例程序,可正常使用管道传参:
program foo integer n character*80 c write (*,*) 'Enter 1,2,3 for cat,dog,fish' read (*,*) n if (n .eq. 1) then write (*,*) 'meow' elseif (n .eq. 2) then write (*,*) 'woof' elseif (n .eq. 3) then write (*,*) 'blurp' else write (*,*) 'error1' endif C write (*,*) 'Enter y,n for yay,nay' C read (*,*) c C if (c == 'y') then C write (*,*) 'yes' C elseif (c == 'n') then C write (*,*) 'no' C elseif (n .eq. 3) then C else C write (*,*) 'error2' C endif end
终端测试结果
C:\my\file\path> C:\my\file\path\foo.exe Enter 1,2,3 for cat,dog,fish 2 woof C:\my\file\path> echo 1 | C:\my\file\path\foo.exe Enter 1,2,3 for cat,dog,fish meow
多组输入报错示例
程序代码与上述示例一致,仅将注释的代码行取消注释,终端测试结果如下:
C:\my\file\path> C:\my\file\path\foo.exe Enter 1,2,3 for cat,dog,fish 3 blurp Enter y,n for yay,nay n no C:\my\file\path> echo 1 y | C:\my\file\path\foo.exe Enter 1,2,3 for cat,dog,fish meow Enter y,n for yay,nay At line 18 of file C:/my/file/path/foo.f (unit = 5, file = 'stdin') Fortran runtime error: End of file Error termination. Backtrace: Could not print backtrace: libbacktrace could not find executable to open #0 0x318dd91b #1 0x318d6b34 #2 0x318d355b #3 0x318d7f6c #4 0x318e8e9d #5 0x318d88df #6 0x318d5190 #7 0x318b1691 #8 0x318f3f93 #9 0x318b13c0 #10 0x318b14f5 #11 0xb9677c23 #12 0xba24d4d0 #13 0xffffffff
环境信息
使用GNU gfortran编译,CMake配置参考官方社区示例内容。
解决方案
报错原因
该问题由Windows cmd的echo输出特性和gfortran运行时的输入处理逻辑共同导致:
Fortran的read(*,*)为列表定向输入,默认每执行一次会读取一整行输入。部分gfortran Windows版本处理管道输入时,单次read完成后会丢弃当前行的剩余未读内容。你使用echo 1 y | 程序的写法仅会输出一行内容,第一次read读取整数1后,剩余的y会被丢弃,第二次read尝试读取新行时无内容可读,触发EOF错误。
解决方法
方法1:cmd多命令输出多行输入
在cmd中用括号包裹多个echo语句,给每一次read单独提供一行输入即可:
(echo 1 & echo y) | C:\my\file\path\foo.exe
方法2:输入重定向(更稳定)
将所有输入参数按顺序每行写一个,保存为文本文件(如input.txt):
1 y
再用输入重定向传递给程序,参数较多时更不容易出错:
C:\my\file\path\foo.exe < input.txt
方法3:PowerShell执行
如果可以使用PowerShell,直接用Write-Output传递多组参数即可,会自动为每个参数添加换行:
Write-Output 1,y | C:\my\file\path\foo.exe
内容的提问来源于stack exchange,提问作者a11
相关产品推荐
相关产品推荐

