2014-10-23 2 views
0

정보 헤더와 그 뒤에 오는 번호가있는 텍스트 파일이 있습니다.이 파일은 읽을 데이터입니다.Fortran은 텍스트 파일을 미리 읽지 않습니다.

헤더에 몇 줄의 줄이 있는지 알 수없고 변수 번호입니다. 내가 파일을 열

filehandle:    65536 
total # scientific data sets:  1 
file description: 
This file contains a Northern Hemisphere polar stereographic map of snow and ice coverage at 1024x1024 resolution. The map was produced using the NOAA/NESDIS Interactive MultisensorSnow and Ice Mapping System (IMS) developed under the directionof the Interactive Processing Branch (IPB) of the Satellite Services Division (SSD). For more information, contact: Mr. Bruce Ramsay at [email protected] 

Data Set #  1 
Data Label:       
Northern Hemisphere 1024x1024 Snow & Ice Chart 
Coordinate System:     Polar Stereographic 
Data Type:       BYTE 
Format:        I3 
Dimensions:         1024  1024 
Min/Max Values:       0 165 
Units:        8-bit Flag 
Dimension #  0 
    Dim Label:       Longitude 
    Dim Format:      Device Coordinates 
    Dim Units:       Pixels 
Dimension #  1 
    Dim Label:       Latitude 
    Dim Format:      Device Coordinates 
    Dim Units:       Pixels 
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 
2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 
3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 

....... : 여기

은 예입니다 사용 :

open(newunit=U, file = ValFile, STATUS = 'OLD', ACCESS = 'SEQUENTIAL', ACTION = 'READ') 

을 그럼, 라인의 유형 라인 및 테스트하여 파일 라인을 읽기 : 헤더 행 또는 데이터 라인 :

ios = 0 
do while (.NOT. is_iostat_end(ios) ) 
    read(U, '(A)', iostat = ios, advance = 'NO') line ! Shouldn't advance to next line 
    if (is_iostat_end(ios)) stop "End of file reached before data section." 
    tol = getTypeOfLine(line, nValues) ! nValues = 1024, needed to test if line is data. 
    if (tol > 0) then ! If the line holds data. 
     exit ! Exits the loop 
    else 
     read(U, '(A)', iostat = ios, advance = 'YES') line ! We advance to the next line 
    end if 
end do 

하지만 루프의 첫 번째 읽기는 항상 다음 줄로 진행되며 이는 문제입니다. 데이터

read(U, '(1024I1)', iostat = ios) Values(c,:) 

1024 세트의 일부 라인을 확장 할 수 있지만, 각각의 세트는 매트릭스 "값"의 행이다

상기 루프를 종료 한 후, 데이터를 판독하는 새로운 루프를 입력한다.

이 두 번째 루프는 테스트 루프 (첫 번째 데이터 행)에서 읽은 마지막 행을 읽지 않습니다.

가능한 해결 방법은 다음 줄로 진행하지 않고 테스트 루프의 줄을 읽는 것입니다. 나는 이것을 위해 사용했다, advance = 'no', 그러나 그것은 여전히 ​​다음 줄로 나아 간다. 왜?.

+0

파일은 어떻게 보이나요? –

+0

진보하지 않는 실제 코드를 보여줍니다. –

+0

나는 명령 백스 페이스의 팬이 아니다.하지만 여기서는 첫 번째 루프가 헤더를 읽은 후 바로 도움이 될 수있다. –

답변

1

진보적이지 않은 읽기는 파일에서 읽는 동안 현재 레코드의 끝 부분에 도달하면 읽기 명령문의 출력 항목 목록에있는 항목을 충족 시키도록 파일 위치를 여전히 다음 레코드 시작 전에 설정합니다. 비 전진이라 함은 결코 발전하지 않는다는 것을 의미하지는 않습니다. read 문에 대한 iostat 지정자에 지정된 변수에 지정된 값을 사용하여 현재 레코드의 끝에 도달했는지 확인합니다. IS_IOSTAT_EOR 내장 함수를 사용하거나 ISO_FORTRAN_ENV의 해당 값을 테스트 할 수 있습니다.

(위의 암시 적 의미는 실제로 읽지 않은 항목이 실제로 읽은 항목에 해당하는 파일 위치를 넘어서고 있다는 사실입니다. 따라서 getTypeOfLine 프로 시저가 적어도 부분적으로 데이터 행을 가지고 있다고 결정하면 해당 행을 이미 읽었습니다. 파일의 위치를 ​​변경하지 않으면 "데이터"read 문에서 그 부분이 누락됩니다.

+0

하지만 매번 그 때마다 나는'read (U, '(A)', iostat = ios, advance = 'NO') 행을 실행합니다. ** 항상 ** 행을 읽으므로 말한대로 ** 'advance = 'NO'옵션에 상관없이 항상 다음 레코드 (라인)로 이동합니다. 사실입니까? 그렇다면'advance = 'NO'는'read' 문에서 전혀 작동하지 않는다는 것을 의미합니다. id est는 완전히 쓸모가 없습니다. 또는이 옵션이'read' 문에서 작동하는 상황이 있습니까? –

+0

아니요, 레코드의 끝까지 도달하지 않으면 앞으로 나아 가지 않습니다. 레코드에서 한 글자를 읽으면 (예 :'CHARACTER (1) :: ch; (예 :'ABCDEFGHIJ'라고 말하면, 10 번 읽으면 레코드 끝까지 갈 수 있습니다. (첫 번째 채널은 (A), ADVANCE = 'NO' 앞선 읽기와의 차이점은, 앞선 읽기 **는 항상 각 읽기 후에 다음 레코드로 진행된다는 것입니다. 읽지 않은 레코드의 문자 – IanH

+0

이제는 이해합니다. ** 모든 ** 항상 ** _field_ 앞에 ** ** 항상 _record_가 아닌 ** 모든 읽기는 _record_를 진행합니다. advance = 'yes'''advance = 'NO' '일 경우, _fields_가 모두 읽혀질 때만 _record_가 진행됩니다 .. –