在Windows命令行中使用管道运行简单的Fortran exe



我有一个Fortran可执行文件,在进行计算之前需要几个键盘输入。它在终端输入输入中工作,但我想使用管道输入(Windows 10命令行)。当我只有一个键盘输入时,管道工作得很好。我怎样才能让它在多个输入下工作?

我几乎可以让它工作基于一个类似的问题在这里:传递参数交互式fortran程序。我看了标准输入的文档,但我还是不明白。

这是一个只有一个输入的示例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:myfilepath> C:myfilepathfoo.exe
Enter 1,2,3 for cat,dog,fish
2
woof
C:myfilepath> echo 1 | C:myfilepathfoo.exe
Enter 1,2,3 for cat,dog,fish
meow

这是一个具有多个输入的示例Fortran程序,它不能使用管道。

与上面的程序相同,但是注释行是不注释的。终端测试:

C:myfilepath> C:myfilepathfoo.exe
Enter 1,2,3 for cat,dog,fish
3
blurp
Enter y,n for yay,nay
n
no
C:myfilepath> echo 1 y | C:myfilepathfoo.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

编译器信息:基于wiki的GNU gfortran, CMake示例

对于windows cmd,您可以使用For循环。

(for %i in (2 y) do @echo %i)|C:myfilepathfoo.exe
Enter 1,2,3 for cat,dog,fish
woof
Enter y,n for yay,nay
yes

如果您将其放入。bat或。cmd中,请记住使用两个%符号。有很多方法可以做到这一点。参见如何在批处理文件中回显换行符?

您有两个简单的read语句。每个读取一条记录=一行文本。您需要提供两个记录,或者让程序在旧记录上继续。

在bash中,我可以做echo -e "2 n y" | ./a.out获得两个记录到一个echo命令,但我不确定Windows cmd。在Powershell中,你应该使用Echo换行符到Powershell控制台。这意味着

echo "2 `n y"

如果您可以更改Fortran代码,请使用非高级输入:

read (*,'(i1)',advance="no") n

我可以做

> echo -e "2 y" | ./a.out 
Enter 1,2,3 for cat,dog,fish
woof

在bash中测试,但应该在其他地方工作,包括cmd。

最新更新