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

Using piping in Windows command line to run simple Fortran exe

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

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

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

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 基于 wiki example

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

I can do echo -e "2 \n y" | ./a.out to get two records into one echo command, but I am not sure about Windows cmd. In Powershell you should use 。也就是说

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。

对于windowscmd,你可以使用for循环。

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

如果将其放入 .bat 或 .cmd,请记住使用两个 % 符号。有很多方法可以做到这一点。参见 How can I echo a newline in a batch file?