почему фортран не читает строку и не записывает в файл?
Я пытаюсь прочитать файл, поместив каждую строку в переменную с именем 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
и аналогичные). Или можно просто считывать отдельные поля непосредственно в переменные по мере необходимости, используя формат, чтобы сообщить коду, где найти отдельные элементы в каждой строке. Для.gro
file, воспользуйтесь вторым подходом. Строки в файле аккуратно расположены так, как указано в формате.
Эта линия
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
это быстро и легко, хотя это может быть не то, что вам нужно.