我有一个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。