Я собираюсь угадать, что означает каждая из переменных, а также попытаюсь объяснить некоторые очевидные ошибки.
Я считаю, что ваша do i=2,n
- ошибка, потому что я видел, как некоторые из моих учеников совершали эту ошибку. Начало i в 2 не означает, что вы читаете со второй строки, это просто значение i. Затем, если у вас есть n строк данных, вы пропустите последнюю строку данных, потому что вы читаете в n-1 строк. То, что вы хотите, это пустой оператор чтения перед циклом. Это пропускает строку заголовка. Тогда вы хотите, чтобы я пошел от 1 до п.
Из порядка переменных в операторе чтения я предполагаю, что ind
- это номер идентификатора, chip
- это номер Idx, а imp
имеет номера Info от 1 целого до каждой из m.
Ваш i8
возьмет первые 8 столбцов информации и попытается интерпретировать их как целое число. Ну, ID001 1 1
- это первые 8 столбцов первой строки данных, и это не целое число. Вам нужно пропустить «ID» и прочитать «001» в ind. Затем пропустите 1 символ и прочитайте 1 целое число в чип, затем пропустите еще 1 символ, затем прочитайте в Info, 1 целое число за раз. Спецификатор формата x
пропускает 1 символ.
Чтобы каждое целое число входило в imp отдельно, вам нужен подразумеваемый цикл do, который идет от 1 до m. Я использовал J там для этого. Если вы не знаете о предполагаемых циклах do, пожалуйста, поищите в Google. Это вполне стандартно в Фортране.
Этот фрагмент кода сделает именно это:
open(unit=100, file='file.txt', status='old', action='read')
read(100,*) ! This skips the header line.
do i=1,n ! Read in n data lines.
read(100,'(2x,i3,1x,i1,1x,*(i1))') ind(i),chip(i),(imp(i,j),j=1,m)
end do
close(unit=100)
Дополнительный ответ на адрес комментария. Я вижу, у тебя было бы два варианта. Во-первых, попадаем в разбор строк. Я бы не выбрал это.
Второй вариант - прочитать строку, используя неформатированный ввод. Неформатированный ввод использует пробелы для разделения элементов ввода. Я бы сделал третий элемент символьной переменной, достаточно длинной, чтобы соответствовать длине m. Эту символьную переменную можно прочитать с помощью оператора Fortran read
. Это называется чтением из внутренней записи. Вы читали бы каждое целое число, как и раньше. Вот как это будет выглядеть:
character(len=m) :: Info
character(len=:),allocatable :: Dumb
open(unit=100, file='file.txt', status='old', action='read')
read(100,*) ! This skips the header line.
do i=1,n ! Read in n data lines.
read(100,*) Dumb, chip(i), Info
read(Info,'(*(i1))') (imp(i,j),j=1,m)
end do
close(unit=100)
Первый оператор read в цикле do читает из файла. Он вставляет весь первый столбец в Dumb
независимо от его длины, второй столбец - в микросхему (i), а весь 3-й столбец - в строку символов с именем Info
.
Вторым оператором чтения является чтение из "внутренней записи" Info. Вы можете использовать оператор read
для символьной строки. Здесь я использую спецификаторы формата и подразумеваемый цикл do для извлечения 1 целого числа за раз.