在记事本文件Fortran中写入数据

时间:2018-06-05 13:27:30

标签: loops fortran fortran95

我试图执行以下操作:

  • 从名为" numbers"的txt文件中读取,该文件包含7行,每行1个字符。第1行有1,第2行有2,第3行有3等等。

  • 读取每一行,注意它是正面还是负面,说明它,然后,如果它是正面的,则将其写入txt文件"肯定"如果没有,请将其写入txt文件"否定"

这是我的代码:

program write
implicit none
integer :: i,x
open (12,file='numbers.txt')
    do i = 1,7
      read(12,*) x
        if (mod(x,2)>0) then
            open(11,file='negatives.txt')
            write (11,*) x
            print *, 'Negative!'
        else
            open(13,file='positives.txt')
            write (13,*) x
            print *, 'Positive!'
        end if
     end do
end program write

它正确告诉我哪个是积极的,哪个是消极的,但当我打开" positives.txt"和" negatives.txt"他们仍然是空白。我该如何纠正这个?

另外,我很幸运,但我认为Fortran会从第一行读取代码7次。对于i = 2,不读取第2行,对于i = 3,不读取第3行,依此类推。因为我在这里看不到任何东西,告诉它从第1行以外的任何一行读取的位置。它是如何做到的?

2 个答案:

答案 0 :(得分:0)

我想不出任何简单的,与Fortran相关的解释你所描述的行为(循环的所有迭代都被执行但没有输出到文件而且没有报告错误消息) - 我能想到的唯一一个必须做的事情使用文件系统或操作系统(例如,NFS故障),仍然应该以错误的形式出现。

然而,

  1. 您说要在不同的文件中写入正数和负数,但您使用的条件是x是正数还是负数mod(x,2)>0,它使用Fortran余数函数https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions088.htm。如果要检查x是正数还是负数,则应直接将x0进行比较,并在输入为零时确定要输出的内容(通常认为既不是正数也不是负数)

  2. 您的open语句未指定任何action,可能性为readwritereadwrite。如果未指定任何操作,则Fortran标准声明默认值与编译器有关,因此您最终可能会得到一个不允许写入的输出文件。在您的情况下,在打开文件action=readnumbers.txt时,您应该在打开文件action=writenegatives.txt时真正指定positives.txt

  3. 如果您想连续多次读取一行(Fortran传说中的记录),您应该在每次读取后使用backspace语句,然后使用单元号有关文件。在你的情况下我无法理解这一点(想要读7行文件的第一行7次是非常反直觉的),但这是要走的路。

  4. 通过在每次迭代中使用open语句,如果程序中没有输出到该文件,则代码会使用有效策略来阻止创建文件。但是,请记住,在open之前不需要write文件,每个文件只能执行一次。明确closeopen的所有文件也是一种很好的编码习惯。

  5. 通过所有这些更改,代码将如下所示:

    program write
        implicit none
        integer :: i,x
        logical :: p_open, n_open
        p_open = .false. ; n_open = .false.
        open (12,file='numbers.txt',action='read')
        do i = 1,7
            read(12,*) x
            if (x<0) then
                if (.not. n_open) then
                    open(11,file='negatives.txt',action='write')
                    n_open = .true.
                end if
                write (11,*) x
                print *, 'Negative!'
            else if (x>0) then
                if (.not. p_open) then
                    open(13,file='positives.txt',action='write')
                    p_open = .true.
                end if
                write (13,*) x
                print *, 'Positive!'
            else ! x==0
                print *, 'Zero found!!'
            end if
            backspace 12
        end do
        if (n_open) close(11)
        if (p_open) close(13)
        close(12)
    end program write
    

答案 1 :(得分:0)

只需将dop循环中的open(11,file ='negatives.txt')和open(13,file ='positives.txt')放在一起即可解决您的问题。此外,您的代码将识别偶数或奇数,而不是正数或负数。 只需对您的代码进行一些修改:

program write
implicit none
integer :: i,x
open(12,file='numbers.txt')
open(11,file='negatives.txt')
open(13,file='positives.txt')
    do i = 1,7
      read(12,*) x
        if (x < 0) then
            write (11,*) x
            print *, 'Negative!'
        elseif (x > 0) then
            write (13,*) x
            print *, 'Positive!'
        else
            print *, 'This is zero.'
        end if
     end do
end program write

这应该有效。