получить ошибку при чтении данных - PullRequest
0 голосов
/ 04 марта 2012

у меня есть один файл данных, в котором данные заполняются таким образом

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
    .
    .

    .

    .
    .
91 92 93 94 95 96 97 98 99 100

я хочу сохранить эти данные в матрице (10,10) это моя программа

program test
integer j,n,m
character,dimension(10,10) ::text
character*50 line
open(unit=3,file="tmp.txt",status='old')
n=1
read(3,"(a50)"),line

read(line,*,end=1),(text(1,i),i=1,10)
1 read(3,"(a50)",end=3),line
n=n+1
read(line,*,end=1)(text(n,i),i=i,10)

3 close(3)

end program test

но я не получаю правильные значения.

Ответы [ 2 ]

5 голосов
/ 05 марта 2012

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

    PROGRAM read_data

    integer :: i
    integer :: numbers(39,39)
    character(10) :: infile = "data.dat"
    character(10) :: outfile = "output.dat"

    open(1,file=infile)
    open(2,file=outfile)

    do i=1,39
        read(1,*) numbers(i,1:39)
    end do

    !write output to check
    do i=1,39
        write(2,'(39I5)') numbers(i,1:39)
    end do

    close(1)
    close(2)

    END PROGRAM

Я бы не рекомендовал использовать строки для хранения переменных любого типа, так как Fortran не очень хорош в обработке строк. Если вам в какой-то момент понадобится использовать ваши данные в качестве строк, запишите их в строковую переменную, как если бы вы записали в файл:

write(my_string,'(I5)') numbers(1,1)

Редактировать: изменен код для чтения в массиве размером 39x39 вместо 10x10.

4 голосов
/ 04 марта 2012

Я не думаю, что сначала делаю чтение в строку, а затем пытаюсь разобрать, что и есть путь;просто позволяйте Фортрану разбивать строку, разделенную пробелом, на строки символов для вас.Также обратите внимание, что вы хотите, чтобы ваш массив символов был массивом строк символов чего-то, а не только символов:

program test
    character(len=3),dimension(10,10) ::text
    character(len=7), parameter :: filename="tmp.txt"
    integer :: i,j
    integer :: nlines

    open(unit=3,file=filename)
    do i=1,10
        write(3,fmt="(10(i3,1x))"), (10*(i-1)+j, j=1,10)
    enddo
    close(unit=3)

    open(unit=4,file=filename,status='old')

    do i=1,10
        read(4,*,end=1), (text(i,j),j=1,10)
    enddo
 1  nlines = i
    close(unit=4)

    print *,' Read in character array: '
    do i=1,nlines-1
        print "(10('<',a,'>',1x))", (trim(text(i,j)), j=1,10)
    enddo

end program test

Запуск этого дает

$ ./test 
  Read in character array: 
<1> <2> <3> <4> <5> <6> <7> <8> <9> <10>
<11> <12> <13> <14> <15> <16> <17> <18> <19> <20>
<21> <22> <23> <24> <25> <26> <27> <28> <29> <30>
<31> <32> <33> <34> <35> <36> <37> <38> <39> <40>
<41> <42> <43> <44> <45> <46> <47> <48> <49> <50>
<51> <52> <53> <54> <55> <56> <57> <58> <59> <60>
<61> <62> <63> <64> <65> <66> <67> <68> <69> <70>
<71> <72> <73> <74> <75> <76> <77> <78> <79> <80>
<81> <82> <83> <84> <85> <86> <87> <88> <89> <90>
<91> <92> <93> <94> <95> <96> <97> <98> <99> <100>
...