Моя IDE — это CodeBlocks с MinGW 9.2.0.
Мне нужна помощь в написании матрицы построчно в текстовом файле.
Это мой простой код:
program matrix
integer :: i, j
integer, dimension(2,2) :: a_mat
forall( i = 1 : 2, j = 1, 2 )
a_mat(i,j) = i + j
end forall
open( unit = 15, file = 'matrix_utput.txt', action = 'write' )
write(15,'(*(i2.2,1x))') ( ( a_mat(i,j), j = 1, 2 ), i = 1, 2 )
close( unit = 15 )
end program matrix
В моем файле .txt
я получил это:
02 03 03 04
Как изменить формат, чтобы получить это:
02 03
03 04
@VladimirF Возможно ли с таким циклом?
Да, с реверсом формата. Но это менее понятно и надо вставлять размер в формат - когда он не фиксированный. Может быть, мы сможем снова открыть вопрос и ответить на этот вопрос.
@VladimirF Можешь показать как?
Я потратил много времени на поиск дубликатов, но пропустил этот. Это была довольно специфическая проблема, поэтому ответ был также довольно конкретным. Я не удалю свой ответ, потому что есть небольшая разница в чтении и письме.
Обычный способ — зацикливать цикл do построчно, как показано на Запись матрицы на Фортране
Но это также можно сделать в подразумеваемом цикле, используя реверсию формата.
write(15,'(2(i2.2,1x))') ( ( a_mat(i,j), j = 1, 2 ), i = 1, 2 )
По сути, число перед скобками должно быть длиной строки (количество столбцов). Если вы поместите туда *
, он поглотит весь массив. Таким образом, он будет открывать новую запись каждый раз, когда формат найдет все свои элементы.
Можно также избавиться от конечного пробела, но я предположил, что это не обязательно.
Итак, просто в заключение: это '(*(1x,i2.2,:))'
нельзя использовать для матрицы с любым количеством столбцов, и единственный способ - поместить количество столбцов в символьную переменную и использовать //
для создания '(987(1x.i2.3))'. Is that correct?
Если вы можете использовать явный цикл вместо подразумеваемого, вы можете сделать это с заранее = нет, пустой записью для запуска перевода строки и атомарной записи, см. это stackoverflow.com/q/25714322/12150218
@Cocofalco Нет необходимости в таких вещах с явным циклом, как дублирующаяся ссылка и ссылка в ответе.
@HarryKastorp Да, или просто используйте обычный цикл do, который обычно используют люди.
@VladimirF Я просто указал, что - Нет - использование оператора вычисляемого формата - не единственный способ сделать это.
Связанный вопрос - это противоположная проблема, но решение такое же: вы перебираете цикл, используя обычный цикл do, и используете подразумеваемый цикл для отдельных строк.