Команда READ
пытается прочитать всю строку, а затем отбросить все, что ей не нужно. Поскольку вы читаете только одно значение на read
, вы читаете только первые значения каждой строки и даже не сохраняете их в правильной переменной.
Вот как я это прочитал бы:
do i = 1, N
read(10, *) A(:, i), B(i)
end do
Я читаю это построчно, сохраняя первые значения в строке A
, а затем последнее значение в B(i)
.
Обновление @agentp отметил, что мое решение выше считывает значения как
A(1,1) A(2,1) A(3,1) A(4,1) A(5,1) B(1)
A(1,2) A(2,2) A(3,2) A(4,2) A(5,2) B(2)
A(1,3) A(2,3) A(3,3) A(4,3) A(5,3) B(3)
A(1,4) A(2,4) A(3,4) A(4,4) A(5,4) B(4)
A(1,5) A(2,5) A(3,5) A(4,5) A(5,5) B(5)
, что отличается от того, что ваш код предлагает вам сделать:
A(1,1) A(1,2) A(1,3) A(1,4) A(1,5) B(1)
A(2,1) A(2,2) A(2,3) ...
...
Чтобы прочитать это в таком порядке, вам нужно изменить строку read
на:
read(10, *) A(i, :), B(i)
Что касается вашего последующего вопроса: если у вас есть какой-либо массив A
(для простоты 1D), вы можете использовать A(3:7)
для доступа только к элементам с 3 по 7 как для чтения, так и для записи. Вы можете опустить любое число для доступа от первого элемента к последнему: A(:7)
означает все элементы, вплоть до элемента с индексом 7, включая A(3:)
означает все элементы, начиная с индекса 3.
И наоборот, A(:)
будет означать, что все элементы A
в случае с массивом 1d ничем не отличаются от простого использования A
. Но если A
многомерно, как здесь, это может быть полезно. В этом случае я использовал A(:,i)
, что означает все элементы со вторым индексом i
.