2012-03-04 10 views
0

읽기에 오류가내가 데이터가 이러한 방식으로 작성되는 하나 개의 데이터 파일이 데이터

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

문자를 읽는 것처럼 보입니다. 숫자는 모두 숫자 또는 공백으로 표시됩니다. 그 맞습니까 ? 또는 정수를 읽고 문자 변수를 버퍼의 일종으로 사용하려고합니다. Fortran 정수를 파일에서 읽는 방법이 아닙니다. 나는 배열 텍스트에 대한 당신의 선언에 너무 당황 스럽다. 확실히 Fortran이 2D 문자 배열을 갖는 것은 맞지만, 종종 C 프로그래머가 부적절한 언어 관용구를 넘기고 있다는 신호입니다. –

답변

4

먼저 문자열을 읽은 다음 구문 분석을 시도하는 것이 좋다고 생각하지 않습니다. Fortran이 공백으로 구분 된 줄을 문자 스트링으로 분리하도록하십시오. 또한 당신이 당신의 문자 배열이 아니라 문자 뭔가 길이 문자열의 배열되고 싶어 참고 :

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> 
+0

thanks .. so 정수로 이러한 값에 액세스 할 수 있습니다 .example 만약 내가 2 (3) 3333 다음에 명령이되어야합니다 – user991852

+0

이 올바른 텍스트 (3,33) * 2 – user991852

+0

미안 .. 곱하면됩니다. 텍스트 (3,33)을 (3,3) – user991852

5

을 제공합니다 정수로, 가장 간단한 방법은 다음과 같이 그것을 할 수 있습니다 :

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 

내가 포트란은 문자열 처리에 아주 좋은 아니므로 어떤 종류의 변수를 저장하는 문자열을 사용하는 것이 좋습니다 않을 것입니다.

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

편집 : 당신이 파일에 쓸 것 같은 어떤 점에서 당신은 문자열 변수로, 문자열로 데이터를 사용하여 작성해야하는 경우 39x39 크기의 배열 대신 10 × 10에서 읽을 코드를 변경.

+0

사실 .dat 파일에 39 개의 행렬 요소가 포함되어있어 .csv 파일에 복사 할 수 없다. 쓰기 코드를 어떻게 읽고 읽을 수 있습니까? 포트란 프로그램에서 – user991852

+1

@ user991852 질문에 말한 것처럼 데이터가 저장되어 있으면 코드가 작동해야합니다. 루프 길이 및 배열 크기를 39로 변경하면됩니다. 포트란의 목록 지향 입력 (읽기 명령문의 *)는 쉼표로 구분 된 값과 쉼표로 구분 된 값 모두에서 작동합니다. – bananafish

+0

고맙습니다 .. 많이 .. 나는 그것을 얻었다. – user991852

관련 문제