Как читать файл (содержащий матрицу mxn) строка за строкой и в каждой строке элемент за элементом?

У меня есть файл с именем "test.dat", который содержит матрицу 10x6 следующим образом:

Содержимое файла test.dat:


2 5 9 0 0 0
1 3 7 6 0 0
0 0 0 0 0 0
0 0 0 0 0 0
1 0 0 0 0 0
0 0 0 0 0 0
4 6 0 0 0 0
3 0 0 0 0 0
2 1 0 0 0 0
0 0 0 0 0 0

Я хочу превратить эту матрицу в матрицу 10х10, содержимое которой выглядит следующим образом:

содержимое файла test1.dat:


0 1 0 0 1 0 0 0 1 0
1 0 1 0 0 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 1 0 0 0 0
0 0 1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

test1.dat - это матрица 10x10, в которой есть строки, построенные этим методом: например, строка 1 файла test1.dat, 0 1 0 0 1 0 0 0 1 0, был на самом деле строка 1 файла test.dat, 2 5 9 0 0 0с той разницей, что его длина изменилась с 6 до 10 и его ith элемент (который был показан в первой строке test.dat) был заменен на 1, т.е. первая строка test.dat фактически говорит, что эта строка должна быть расширена до 10 элементов, а ее 2-й, 5-й и 9-й элементы должны быть заменены на "1", а остальные на ноль.
Чтобы преобразовать test.dat (матрица A(10x6)) в test1.dat(матрица B(10x10)), я должен сначала прочитать каждую строку элемента test.dat по элементам и для этого, например, строку "j", если ее элемент был равен например "Z", я пишу b(j,z)=1 (B (j,z) элемент). До сих пор я просто мог попытаться прочитать "A", элемент за элементом, как показано ниже:

   program test1  
      Integer (kind=8) :: c  
      integer (kind = 8) :: g, h  
      INTEGER, DIMENSION(10,6) :: z  
      open (unit=20, file="test.dat", access="sequential", form="formatted")  
      do g=1,6  
              Read(20,*) z  
              write (*, *) z  
      end do  
   end program test1  

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

В строке 7 файла test1.f90 (unit = 20, file = 'test.dat')
Ошибка выполнения Fortran: конец файла

Теперь мои вопросы:

  1. Правильно ли написан этот код?
  2. В чем проблема с этим кодом, который я получаю вышеупомянутую ошибку?
  3. Как я могу выполнить оставшуюся часть процедуры, чтобы получить "файл test1.dat"?

Я ценю это, если кто-нибудь поможет мне здесь.

PS Информация о машине:
"Linux 3.16.6-200.fc20.x86_64 (fedora 20)"
"gcc версии 4.8.3 20140911 (Red Hat 4.8.3-7) (GCC)"
"используя.f90"

1 ответ

Нет, код неверный. Рассмотрим цикл

  do g=1,6  
          Read(20,*) z  
          write (*, *) z  
  end do  

Это пытается прочитать все 60 элементов z 6 раз В файле недостаточно чисел, и система во время выполнения обнаруживает конец файла до его завершения - с результатом, который вы наблюдали.

Простым подходом к чтению файла построчно было бы изменить цикл следующим образом:

  do g=1,10  
          Read(20,*) z(g,:)  
          write (*, *) z(g,:)    
  end do  

Эта версия читает z по одной строке за раз.

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

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