почему фортран не читает строку и не записывает в файл?

Я пытаюсь прочитать файл, поместив каждую строку в переменную с именем row, и из этой строки я беру значения в определенных местах и ​​помещаю их в другую переменную. Который затем должен записать в файл. Как ты это делаешь?

program read_block
implicit none
real :: x,y
integer :: ios
character(len=100) :: row

open(unit=101, file='block2trimmed.gro',action='read',status='old')
open(unit=102, file='readoutput.gro', action='write',status='new')
do
read(101, '(i5,2a5,i5,3f8.3,3f8.4)',iostat=ios) row
if (ios /= 0) exit
read(row(21:28),*) x
read(row(29:36),*) y


write(102,*) x , y
end do
close(101)
close(102)
end program read_block

1 ответ

OP, похоже, смешивает два разных подхода к чтению файла, любой из которых будет работать, но не оба одновременно.

Можно было прочитать всю строку текста (в row переменную), затем выделите ее в отдельные поля данных (используя read(row(21:28),*) xи аналогичные). Или можно просто считывать отдельные поля непосредственно в переменные по мере необходимости, используя формат, чтобы сообщить коду, где найти отдельные элементы в каждой строке. Для.grofile, воспользуйтесь вторым подходом. Строки в файле аккуратно расположены так, как указано в формате.

Эта линия

read(101, '(i5,2a5,i5,3f8.3,3f8.4)',iostat=ios) row

внимательно говорит компилятору прочитать

  • целое число в 5-символьном поле;

  • две строки по 5 символов каждая;

  • другое целое число в 5-символьном поле;

  • 3 действительных числа из 8-значного поля с 3-мя цифрами после запятой; а также
  • 3 действительных числа из 8-значного поля с 4-мя цифрами после запятой;

а затем велит ему поместить их все в строку из 100 символов, которая называется row. Это какое-то безумие, и еще более безумное, когда он затем пытается разобрать строку обратно на отдельные элементы. Выбросьте эту строку и замените ее чем-то вроде:

read(101, '(i5,2a5,i5,3f8.3,3f8.4)',iostat=ios) int1, str1, str2, int2, r1, r2, r3, r4, r5, r6

Чтобы это сработало, вам нужно будет объявить все эти переменные, и вы, возможно, захотите дать им более значимые имена. И если вас интересуют только некоторые из переменных, игнорируйте другие.

Можно было бы прочитать строку в строке row а затем разобрать его на части, но потребуется еще 10 строк кода, чтобы добиться того, что делает эта одна строка, и обходится без rowвсе вместе. Громос.gro Файл разработан для удобного чтения, поэтому его легко читать.

Что касается их записи, правильный способ сделать это зависит от того, что вы хотите делать дальше с данными, кроме строки

write(102,*) int1, str1, str2, int2, r1, r2, r3, r4, r5, r6

это быстро и легко, хотя это может быть не то, что вам нужно.

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