【问题标题】:Using piping in Windows command line to run simple Fortran exe在 Windows 命令行中使用管道运行简单的 Fortran exe
【发布时间】:2021-09-21 18:38:51
【问题描述】:

我有一个 Fortran 可执行文件,它在进行计算之前需要几个键盘输入。它在输入输入的终端中工作,但我想使用管道输入输入(Windows 10 命令行)。当我只有一个键盘输入时,管道可以完美运行。如何让它与多个输入一起工作?

我几乎可以根据这里的类似问题让它工作:Passing arguments to interactive fortran program。我查看了有关标准输入的文档,但仍然无法弄清楚。

这是一个只有一个输入的示例 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

【问题讨论】:

  • 这个问题的答案取决于程序是如何工作的。如果它没有命令行参数或不采用标准输入,那么它就不能作为“单线”工作。可能有一些“记录和回放”程序可以工作。这个问题与源代码无关,因此对于 SO 来说是题外话。请查阅您的 foo.exe 用户文档。
  • 对于所有 Fortran 问题,请使用 fortran 标签。 Fortran 90 只是该标准的一个非常古老的修订版。

标签: windows cmd fortran pipe gfortran


【解决方案1】:

对于windows cmd,只需要使用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?

【讨论】:

  • 非常感谢,正是我要找的东西
【解决方案2】:

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

中,我可以使用echo -e "2 \n y" | ./a.out 将两条记录输入one echo command,但我不确定Windows cmd。在 Powershell 中,您应该使用 Echo newline to powershell console。这意味着

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 2017-01-22
    • 2012-12-27
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多