Запись данных в файл блокнота Фортран
Я пытаюсь сделать следующее:
Чтение из текстового файла с именем "numbers", который представляет собой файл с 7 строками, по 1 символу на строку. В строке 1 - 1, в строке 2 - 2, в строке 3 - 3 и т. Д.
Прочитайте каждую строку, отметьте, является ли она положительной или отрицательной, укажите ее, затем, если она положительная, запишите ее в текстовый файл "позитив", а если нет, запишите ее в текстовый файл "негатив"
Вот мой код:
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" и "absolutes.txt", они остаются пустыми. Как мне исправить это?
Кроме того, мне повезло, но я подумал, что учитывая код, который Fortran будет читать из первой строки 7 раз. Не читайте строку 2 для i = 2 и строку 3 для i = 3 и так далее. Поскольку я не вижу здесь ничего, говорящего, где читать из любой строки, кроме строки 1. Как он узнал, как это сделать?
1 ответ
Я не могу придумать ни одного простого, связанного с Фортраном объяснения поведения, которое вы описываете (все итерации цикла выполнены, но нет вывода в файлы и сообщений об ошибках не сообщается) - единственные, которые я могу придумать, имеют отношение к файлу система или операционная система (например, сбой NFS), и все еще должны отображаться в виде ошибок.
Тем не мение,
Вы говорите, что хотите записать положительные и отрицательные числа в разных файлах, но условие, которое вы используете, чтобы решить, стоит ли
x
положительный или отрицательныйmod(x,2)>0
, которая использует функцию остатка Фортрана https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions088.htm. Если вы хотите проверить, является ли х положительным или отрицательным, вы должны напрямую сравнитьx
с0
и решить, что вы хотите вывести, когда вход равен нулю (который обычно не считается ни положительным, ни отрицательным).Ваш
open
заявления не указываютaction
возможностиread
,write
, или жеreadwrite
, Если действие не указано, стандарт Fortran утверждает, что по умолчанию это зависит от компилятора, так что вы можете получить выходной файл, в который вам не разрешено писать. В вашем случае вы должны действительно указатьaction=read
при открытии файлаnumbers.txt
а такжеaction=write
при открытии файловnegatives.txt
а такжеpositives.txt
,Если вы хотите прочитать строку (запись в Фортране) несколько раз подряд, вы должны использовать
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
Просто поместите open(11,file='negatives.txt') и open(13,file='positives.txt') из цикла do, чтобы решить вашу проблему. Кроме того, ваш код должен определять четные или нечетные числа, а не положительные или отрицательные числа. Просто нужно внести небольшие изменения в свой код:
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
Это должно работать.