如何将单元号连接到stdin和stdout?

时间:2014-10-10 09:18:12

标签: fortran fortran77

我已经覆盖了保留的UNIT NUMBER 5和6来分别读写文件。所以我现在无法阅读stdin并撰写stdout

我想分别将stdin和stdout连接到新的UNIT NUMBERS 7和8,而不是改变我的所有代码。我怎么能这样做?

修改#1

让我举一个例子来澄清我的情况。

OPEN (UNIT=5, FILE='input.txt', status='OLD')
OPEN (UNIT=6, FILE='output.txt', status='REPLACE')
...some code...
READ (5, *format1*) x, y, z
WRITE (6, *format2*) i, j ,k

原始代码不是由我编写的,大约有4000行。由于我是fortran77的新手,所以我不想修改OPEN声明,因为我担心这会导致更多问题让我解决。如果可以将stdinstdout重新连接到新的UNIT NUMBER,它将使我远离许多潜在的麻烦。

修改#2

请清楚阅读我的问题。我的问题是如何做到这一点。我并不担心这样做是否有益。如果不可能这样做,那对我来说也是一个有效的答案,可以防止其他人重复同样的问题。谢谢大家。

3 个答案:

答案 0 :(得分:1)

您发现5并且6根本没有保留,它们只是通常预先连接到stdinstdout的单位在类Unix操作系统上。我不相信有一种语言标准和便携方式将其他单元连接到那些伪文件。我也相信,通过陈述我缺乏信念,我会抽出一个知道如何做你想要的人。我们会看到。

与此同时,如果您使用的是英特尔Fortran编译器,则可以通过设置环境变量FOR_PRINTFOR_READ的值来重定向发送到文件的输出或从文件中提取的输入。有关详细信息,请查看编译器文档。

最后,我不明白你是怎么做到你需要做你认为你需要做的事情。当然,全局搜索和替换好的编辑器将解决问题?对我而言,更令人困惑的是,如果您已在单位56上打开文件,您肯定可以修改一些open语句吗?

答案 1 :(得分:1)

如果您正在使用gfortran,您可以尝试设置环境变量GFORTRAN_STDIN_UNIT和GFORTRAN_STDOUT_UNIT以选择要分别预先连接到stdinstdout的单元号。

详细信息可在本文档中找到:

gfortran.pdf

答案 2 :(得分:1)

以下解决方案显示了linux上的重新连接,其中可以找到伪文件/dev/stdin/dev/stdout/dev/stderr。由于这些文件在Windows上不可用,因此这是不可移植的解决方案。

如果你想为linux开发,你只需用你喜欢的单位打开这些文件(最好用@VladimirF指出的命名变量)。虽然,我不确定,如果下面的代码与Fortran77兼容(你真的需要Fortran77吗?)。

program test

    integer :: stdin, stdout, a

    ! open the files
    open(7, file="/dev/stdout", status="old")
    open(8, file="/dev/stdin", status="old")

    ! read and write an integer from/to the terminal
    read(7,*) a
    write(8,*) a
end program