2010-07-12 2 views
0

입력 파일의 헤더를 지나서 read()를 읽은 다음 그 길의 값을 읽습니다.Fortran에서 배열에 (큰) N 개의 실수를 포함하는 행을 읽습니다.

이제 할당 가능 배열 A (L, L)의 요소에 입력해야하는 L^2 연속 실수가 생겼습니다.

시도

  character *100 :: buffer 
      read (1,10) buffer 
10  format(a(L*10)) 

Error: Syntax error in FORMAT statement at (1) 
Error: FORMAT label 10 at (1) not defined 

결과 그러나 나는 실수의 (거대) 가변 수를 처리하는 방법을 다른 모르겠어요.

시도 :

do i=1,L 
    do j=i,L 
     read (1,"(f10.7)") buffer 
     read (buffer,*) A(i,j) 
    enddo 
    enddo 

예외 :

Fortran runtime error: Expected REAL for item 2 in formatted transfer, got CHARACTER 
    (f10.7) 

단순히 (1, "(A1000)") L 결국 큰, 그래서 정말 필요한 끝날 것 같은를 읽을 수 없습니다 요소를 하나씩 파싱하는 방법입니다.

방법이 있습니까?

+1

귀하의 질문을 이해하는 데 어려움이 있습니다. "실수로 한 줄에서 할당 가능한 배열로 읽는 법"을 묻고 있습니까? ? (L이 알려지지 않은 경우 문자 변수로 읽은 다음 내부 읽기를 사용하여 카운트하고 배열로 읽음). – Rook

답변

3

머리글을 처리 한 후 문자열로 읽어 들이고 문자열을 구문 분석하여 "멋진"작업을 수행 한 후 파일에서 숫자를 직접 읽고 "버퍼"문자를 건너 뛰지 않는 이유는 무엇입니까?

"read (unit, *) A"는 "목록 지향 IO"라고합니다. 검색 할 항목이나 조회 할 항목을 알고 싶다면 좋은 접근 방식 인 것 같습니다. 매우 융통성이 있습니다. 숫자를 열에 정확하게 정렬하는 것에 관심을 가질 필요가 없습니다. 배열 "A"를 방금 읽으면 요소는 Fortran 배열 요소 순서로 읽혀집니다.

Fortran 2003에서는 가변 형식 반복 지정자로 "*"를 사용할 수 있습니다 : read (unit, '(* (F10.7))). 그러나 아직 많은 컴파일러가이를 지원하지는 않습니다. 이렇게하는 것이 가장 쉬운 방법은 필요할 때보 다 큰 값을 사용하는 것입니다. 목록에 더 이상 읽을 항목이 없을 때 읽기가 중단됩니다. 반복 지정자는 항목 수를 초과 할 수 있습니다 독서.

+0

+1 : 나보다 낫다. – eruciform

0

이 제품을 찾고 계 셨나요?

http://www.tek-tips.com/viewthread.cfm?qid=1420862&page=1

업데이트 :

http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/chap05/format.html http://rainbow.ldgo.columbia.edu/data/fortranreaddata.html

이 포맷되지 않은 레코드 길이의 독서를 통해 이동합니다. Fortran I/O를 엉망으로 만든 이후 오랜 시간이 걸렸습니다. 나는 OPEN 또는 READ 플래그가있어 다음 줄로 계속 진행해서는 안되지만 다음 READ가 거기에서 시작될 수 있도록 파일 포인터를 제 위치에 유지한다는 것을 명시합니다.

read (1,*) A
write (*,*) A

는 표준이 무엇을하고 있는지 알고있는 것 같은데, 내가하지 않더라도 :하지만 ... 오프 손

+0

사실, 모든 값이 같은 줄에 있으므로 줄 단위로 구문 분석하는 것이 실제로 의미가 없습니다. 감사합니다. 감사합니다. – Samizdis

+0

은 더 많은 정보로 업데이트되었지만 아직 완전한 대답은 아닙니다. 배열로 읽으려고했는데 실제 배열을 나타내는 형식을 사용 했습니까? – eruciform

+1

같은 줄에서 계속 읽으려면 read 문에 "advance = 'no'"를 사용할 수 있습니다. 나는이 문제에 대해 이것을 사용할 것이라고 생각하지 않는다. –

0

하하를 기억 할 수없는,이 작동하는 것 같다 .

+2

그건 아주 위험한 접근입니다. – Rook

+0

왜 위험합니까? – Samizdis

+0

당신이하는 일을 모르기 때문에. 그리고 그 접근 방식을 사용하면 프로그램이 실제로 완전히 다른 무언가를 수행하는 동안 무언가를하고 있다고 생각할 상황에 처하게 될 것입니다. 그리고 그것은 위험 할 수 있습니다. – Rook

관련 문제