Fortran: добавить столбец за столбцом в файл

Код состоит из цикла выполнения и создает массивы данных до тех пор, пока работает. Мне нужно, чтобы эти массивы были добавлены в файл как новые столбцы.

Первый столбец фиксирован (длины волн), а второй генерируется в ходе первого запуска:

OPEN (unit=11,file=filename // '.csv')  
WRITE(11,'(i4,A1,f10.6)') (lambda(ii),tab,resv(ii), ii=1,nw)
CLOSE(11)

lambda — это длина волны (4 цифры), tab объявлен как char(9), а resv — мои данные (плавающие). Массив состоит из nw=2000 элементов.

Первый запуск сценария дает мне хороший результат, который я могу загрузить в MS Excel как .csv. Однако сценарий должен вернуться к началу цикла, вычислить новые данные и сохранить измененные элементы «resv» в новый столбец.

Но когда я иду, как

WRITE(11,'(T17,i4,A1,f10.6)') (lambda(ii),tab,resv(ii), ii=1,nw)

новые данные действительно сохраняются в столбце 17, но все предыдущие данные удаляются! Итак, как я могу сказать Fortran «добавить» новый столбец?


person offeltoffel    schedule 11.06.2014    source источник
comment
Вы не можете редактировать файл из программы. Переименуйте файл со старыми данными, прочитайте старый файл и запишите новый файл со старыми и новыми данными. Когда вы закончите, удалите старый файл.   -  person cup    schedule 11.06.2014
comment
это кажется слишком похожим на stackoverflow.com/questions/24157423/, пожалуйста, обновите/уточните исходный вопрос   -  person steabert    schedule 11.06.2014
comment
Конечно, это похоже, есть две проблемы для одного и того же кода. Ответ на последний вопрос был необходим даже для того, чтобы попасть сюда. но это не окончательное решение. Это моя актуальная проблема.   -  person offeltoffel    schedule 11.06.2014
comment
@cup: Та же проблема. Когда я читаю старые данные, как мне сказать fortran, что он должен использовать для этого два новых столбца?   -  person offeltoffel    schedule 11.06.2014
comment
Вы просто не можете писать в новые столбцы в существующем файле. Не с фортраном или любым другим языком. Вы должны либо переписать весь файл, либо инициализировать файл пустыми заполнителями и использовать прямой доступ. см. stackoverflow.com/questions /23834138/   -  person agentp    schedule 11.06.2014
comment
Спасибо, georgte: Ссылка была очень полезной! Я решил проблему, переставив свою матрицу и сохранив переменные построчно, что намного проще, чем столбец за столбцом!   -  person offeltoffel    schedule 13.06.2014


Ответы (1)


Попробуйте такой вариант. Посмотрите код в addcolumn. Ограничение состоит в том, что ваша строка не может быть длиннее 1024 символов. Вы можете увеличить размер массива в соответствии с вашими потребностями.

  module mod_helper
     integer, parameter:: AMAX = 10
     integer, dimension(AMAX):: coldata
     integer:: revision
  contains
     subroutine init
        revision = 0
        do ii = 1, AMAX
           coldata(ii) = ii
        end do
     end subroutine init

     subroutine increment(howmuch)
        integer, intent(in):: howmuch
        coldata = coldata + howmuch
     end subroutine

     subroutine addcolumn(csvname)
        character*(*), intent(in) csvname
        integer(kind=2):: status
        integer:: prevlen
        character(1024):: prev, oldname, newname
        integer, parameter:: oldfile = 20, newfile = 30

        write(oldname, "(A,I3.3,'.csv')") csvname, revision
        revision = revision + 1
        write(newname, "(A,I3.3,'.csv')") csvname, revision
        if (revision .gt. 1) then
            ! Open the old file
            open(oldfile, file=oldname, access="sequential", status="old")
        end if
        open(newfile, file=newname, access="sequential", status="new", action="write")
        prev = ' '
        do ii = 1, AMAX
            if (revision .gt. 1) then
                ! read previous contents as a string
                read(oldfile, "(A)") prev
                prevlen = len(trim(prev))
            else
                prevlen = 1
            end if
            ! write previous and new contents
            write(newfile, "(A, I4, ',')") prev(1:prevlen), coldata(ii)
        end do
        ! delete the previous file
        if (revision .gt. 1) close(oldfile, status='delete')
        close(newfile)
     end subroutine
  end module

  program main
     use mod_helper

     call init
     call addcolumn('col')
     call increment(1)
     call addcolumn('col')
     call increment(20)
     call addcolumn('col')
  end program
person cup    schedule 11.06.2014