我试图执行以下操作:
从名为" 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行以外的任何一行读取的位置。它是如何做到的?
答案 0 :(得分:0)
我想不出任何简单的,与Fortran相关的解释你所描述的行为(循环的所有迭代都被执行但没有输出到文件而且没有报告错误消息) - 我能想到的唯一一个必须做的事情使用文件系统或操作系统(例如,NFS故障),仍然应该以错误的形式出现。
然而,
您说要在不同的文件中写入正数和负数,但您使用的条件是x
是正数还是负数mod(x,2)>0
,它使用Fortran余数函数https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions088.htm。如果要检查x是正数还是负数,则应直接将x
与0
进行比较,并在输入为零时确定要输出的内容(通常认为既不是正数也不是负数)
您的open
语句未指定任何action
,可能性为read
,write
或readwrite
。如果未指定任何操作,则Fortran标准声明默认值与编译器有关,因此您最终可能会得到一个不允许写入的输出文件。在您的情况下,在打开文件action=read
和numbers.txt
时,您应该在打开文件action=write
和negatives.txt
时真正指定positives.txt
。
如果您想连续多次读取一行(Fortran传说中的记录),您应该在每次读取后使用backspace
语句,然后使用单元号有关文件。在你的情况下我无法理解这一点(想要读7行文件的第一行7次是非常反直觉的),但这是要走的路。
通过在每次迭代中使用open
语句,如果程序中没有输出到该文件,则代码会使用有效策略来阻止创建文件。但是,请记住,在open
之前不需要write
文件,每个文件只能执行一次。明确close
您open
的所有文件也是一种很好的编码习惯。
通过所有这些更改,代码将如下所示:
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
这应该有效。