Запись данных в файл блокнота Фортран

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

  • Чтение из текстового файла с именем "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), и все еще должны отображаться в виде ошибок.

Тем не мение,

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

Просто поместите 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

Это должно работать.

Другие вопросы по тегам