Команда для создания нового файла данных или чтения уже созданного файла данных в Фортране проста.
Например, open(12, file='new.dat', action='write'/'read')
.
Но я хочу сделать это внутри цикла. Потому что, скажем, мне нужно создать 500 различных файлов данных, а также прочитать их позже. Поэтому выполнять вручную очень затруднительно.
Но я не знаю, можно ли это вообще сделать таким простым способом. Я думаю, что это главным образом из-за того, как Фортран называет файлы, например. 'new.dat'
выше. Внутри цикла он не может сам по себе непрерывно генерировать файлы, присваивая им имена.
Я попробовал следующее:
program test_file_opening
implicit none
!real ::
integer :: i
do i = 1, 10
open(i, file='i.dat', action='write')
end do
do i = 1, 10
write(i,*) 'hallo world!'
end do
end program
Как и ожидалось, i
находится в кавычках, и создается только один файл данных, содержащий только однострочный текст hallo world!
.
Есть ли способ создать множество файлов внешних данных (с записями, указанными в коде) в цикле do на Фортране?
@QuestionTheAnswer Быть новичком - это нормально, но вам действительно стоит попробовать изучить основы Фортрана. Популярная книга для этого — «Объяснение современного Фортрана». Кроме того, существует сообщество fortran-lang.org и связанный с ним форум, который, возможно, больше подходит новичкам, чем SO.
Этот генерирует 10 .dat
файлов с надписью «Hello world!» в них:
program test_file_opening
implicit none
!real ::
integer :: i, ios
character(len=10) :: filename
do i = 1, 10
write(filename, '(I0)') i
filename = trim(adjustl(filename)) // '.dat'
open(i, file=filename, status='new', iostat=ios)
if (ios /= 0) then
print *, 'Error opening file ', filename
else
write(i, *) 'Hello World! ', i
close(i)
end if
end do
end program
выглядит намного длиннее, но write(filename, '(I0)') i
преобразует целое число i
в строку и записывает его в filename
, после этого filename = trim(adjustl(filename)) // '.dat'
добавляет .dat
к целочисленной строке.
Спасибо! Но чтобы прояснить некоторые понятия, объясните, что такое «'(I0)'»? Например, «I1», «I10», почему ни один из них? Почему в команде open нет оператора action = "write"? И почему «лен» принимается за «10»?
@QuestionTheAnswer I
устанавливает формат (целое число), «0» устанавливает минимальную ширину. В этом случае, поскольку мы преобразуем целое число в строку, необходимо установить минимальный размер для представления целого числа, чтобы оно не дополнялось пробелами нулей. Что касается открытия файла без «action = "write"': действие по умолчанию — «чтение и запись», поэтому я просто пропустил его. если вам нужно запретить чтение из файла, вы можете вернуть 'action = "write"'.
Я имею в виду запретить чтение изнутри этой части кода. Этот файл по-прежнему можно читать из другого места.
Я попытался использовать тот же код в этом ответе, чтобы «прочитать» все созданные файлы данных. Я попытался изменить «write(filename, '(I0)') i» на «read(filename, '(I0)') i». И установите «статус» на «старый». Но при компиляции Фортран показывает ошибку «Ошибка: переменная ‘i’ в (1) не может быть переопределена внутри цикла, начиная с (2)». Что я должен делать?
@francescalus Я не мог этого понять, наверное, нужно начать с более простого.