Запись данных в файл блокнота Фортран - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь сделать следующее:

  • Чтение из текстового файла с именем "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 Ответ

0 голосов
/ 05 июня 2018

Я не могу придумать ни одного простого, связанного с Фортраном объяснения поведения, которое вы описываете (все итерации цикла выполнены, но нет вывода в файлы и нет сообщений об ошибках) - единственные, которые я могу придумать, нужно сделатьс файловой системой или операционной системой (например, сбой NFS), и все равно должен отображаться в виде ошибок.

Однако

  1. Вы говорите, чтоВы хотите записать положительные и отрицательные числа в разных файлах, но условие, которое вы используете для определения положительного или отрицательного значения x, равно mod(x,2)>0, в котором используется функция остатка Фортрана https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions088.htm. Если вы хотите проверитьнезависимо от того, является ли x положительным или отрицательным, вы должны непосредственно сравнить x с 0 и решить, что вы хотите вывести, когда ввод равен нулю (что обычно не считается ни положительным, ни отрицательным).

  2. Ваши операторы open не указывают никаких action, возможны read, write или readwrite.Если действие не указано, стандарт Fortran утверждает, что по умолчанию это зависит от компилятора, так что вы можете получить выходной файл, в который вам не разрешено писать.В вашем случае вы действительно должны указать action=read при открытии файла numbers.txt и action=write при открытии файлов negatives.txt и positives.txt.

  3. Если вы хотите прочитатьСтрока (запись, в Фортране) несколько раз подряд, вы должны использовать оператор backspace после каждого чтения, которое вы хотите повторить, а затем номер единицы соответствующего файла.Я не могу понять этого в вашем случае (желание читать 7 раз первую строку 7-строчного файла довольно нелогично), но это путь.

  4. Имея оператор 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...