2012-04-03 2 views
5

나는 Fortran에서 수년간 일해 왔지만, 파일 입출력은 나에게 아직도 흐리다. 내 이해가 status, form, access, recl이므로 이 (가) 대학원에서 특정 사용 사례가 필요하기 때문에 제한적입니다.
Fortran 바이너리 파일에는 파일의 크기를 설명하는 추가 정보가 파일의 맨 위에 있다는 것을 알고 있습니다. 하지만 필자가 전에는 문제가되지 않았는데, 그 이유는 추가 정보가 필요하지만 보이지 않는 Fortran 코드로만 Fortran 파일을 처리해야하기 때문입니다.Fortran에서 바이너리 파일 열기 : 상태, 형식, 액세스

그러나 어떻게하면 Fortran에서 플랫 파일을 열 수 있습니까? 과거

,이 같은 수행하여 포트란을 사용하여 포트란 바이너리를 열 수 있습니다

open(id,file=file_name,status='old', 
    +  form='unformatted',access='direct',recl=4,iostat=ok) 
     if (ok .ne. 0) then 
     write(1,20) id,ok,file_name 
       else 
     write(1,21) id,file_name 

을하지만 포트란 헤더 정보가없는 플랫, 바이너리 파일이 변경을 수행하는 방법 ? 더 중요한 것은이 용어를 더 자세히 설명 할 수있는 좋은 링크는 어디입니까? status, form, access, recl?

+0

글쎄, "C++"바이너리를 말할 때, 나는 C++ 프로그램에 의해 작성된 원시, 플랫 바이너리 파일을 의미한다. 파일 형식은 1 바이트 정수의 행과 열로 채워진 평면 이진 파일입니다. 필자의 주요 관심사는 파일에 일반적인 Fortran 헤더가 없으면 Fortran에서 이진 파일을 읽으려고한다는 것입니다. – theJollySin

+0

그런데 어떤 언어를 사용하든 관계없이 완전히 관련이 없으므로 실제 문제가 흐트러집니다. 그것을 편집하고 C++ 태그를 제거했습니다. – Mat

+0

그건 공평 해. 필자는 이것을 읽으려고했던 보통의 Fortran 바이너리라고 강조하기 위해 제목과 텍스트에 넣었습니다. 아직도 명확한 한, 나는 행복하다. – theJollySin

답변

8

나는이 일을 싫어하지만, 나는이 게시물에 대한 답을 찾으려한다면, 앞으로 방법이 명확하지 않을 것이라고 생각합니다. 그래서 앞으로 나아갈 길이 있습니다.

짧은 버전 포트란 90분의 77에서

, 당신이 쓸 수있는 표준 포트란 바이너리 파일을 엽니 다 :

OPEN (5, FILE="myFile.txt") 

을하지만 것 평평하고 비 포트란 바이너리 파일을 엽니 다 이 같은 더 뭔가를 작성해야합니다 : 포트란 스타일 바이너리 파일은 4 바이트의 헤더와 F를 가지고 있기 때문에

OPEN(5, file="myFile.txt", form='unformatted', access='direct', recl=1) 

이 차이는 파일의 각 "기록"주위에 눈물. 이 머리말/꼬리말은 레코드에 포함 된 데이터의 크기를 나타냅니다. (가장 일반적인 경우, 발생하는 각 바이너리 파일에는 하나의 레코드 만 있습니다.)

긴 버전

포트란

는 기본적 open 인수의 많은 가정합니다. 사실 원래의 예제는 가정 된 모든 기본값을 보여주기 위해 다음과 같은 자세한 형식으로 작성 될 수 있습니다.
OPEN (5, FILE="myFile.txt") 
OPEN (5, FILE="myFile.txt", FORM="FORMATTED", 
    + ACCESS="SEQUENTIAL", STATUS="UNKNOWN") 

은 우리가 각 인수를 살펴 보자 :

  • FORM 파일이 텍스트 (form='formatted') 또는 이진 데이터 (form='unformatted')로 구성되어있는 경우가 정의합니다. 당신이 순서 (access='sequential')에있는 파일에서 데이터를 읽는 또는 임의의 순서로 당신이 (access='direct'를) 원하는 경우

  • ACCESS 정의합니다.

  • RECL은 각 레코드에 들어갈 바이트 수를 정의합니다. 예를 들어 recl=1은 레코드 길이가 각각 1 바이트라고 말합니다. 아마도 그것은 1 바이트 정수입니다.

  • 상태은 파일이 이미 존재하는지 여부를 정의합니다. STATUS="UNKNOWN" 인수는 파일이 아직 존재하지 않을 수도 있음을 의미하지만, 존재하지 않으면 생성됩니다. 이전 파일을 덮어 쓸 가능성을 막으려면 STATUS="OLD"을 사용하십시오. 마찬가지로 파일이 아직 존재하지 않는다는 것을 알고 있다면 STATUS="NEW"을 사용하는 것이 좋습니다. 추가 정보

:이 열린 문은 또한 따를 읽기/쓰기/닫기 제표에 영향을

. 저의 원래 게시물에서 직접 액세스 파일을 여는 경우 직접 액세스 파일에 작성해야한다는 것을 알아야했습니다. (즉, 바이너리에 포함 된 Fortran 헤더/푸터는 없습니다.) 그러나 Fortran의 기본 기능은 Fortran 헤더와 바닥 글이 포함 된 순차 액세스 파일을 만드는 것입니다. 포트란 90분의 77에서 open 문에 대한 자세한 내용은

, 온라인 좋은 자원이있다 : 주교 대학의 린 Jinsen에 의해

A nice page가 (당신 너무 감사합니다).

Slightly more official documentation IBM이 컴파일러에 제공합니다.

1

당신은 access='stream'와 포트란 2003 년 새로운 스트림 IO 모드를 사용하도록 open을 알 수 있습니다.

+0

아, 멋져요, 네. 그러나 나는 Fortran 77을 사용하여 붙어 있습니다. – theJollySin

+4

어떻게 Fortran 77을 사용할 수 있습니까? 더 이상 컴파일러가 없기 때문에 F90을 컴파일 할 수 없습니까? – haraldkl

+1

@haraldkl - 그러나 많은 사람들이 새로운 개정판을 배우기를 거부하고 F77을 주장하지만 어리석게 들릴지도 모릅니다. 왜 포트란 4 세가 아니라고, 나는 항상 묻는다. – Rook

5

하나의 경고는 recl의 레코드 길이가 기본적으로 포맷되지 않은 레코드가있는 4 바이트 단어 수 (Intel 컴파일러에서는 최소한 byterecl을 사용)를 사용하므로 컴파일러 옵션을 지정하거나 recl=1. 코드가 서식하고 직접 사용하는 약자로

, 당신이 할 필요가 제대로 적절한 레코드 길이를 선택하는 것입니다 데이터를 읽을 수 있도록합니다. 그러나, 일부 FORTRAN 컴파일러는 항상 포맷되지 않은 바이너리 파일과 함께 좋은 재생되지 않는 나는 앞으로 HDF5을 채택 제안.

가능한 경우, 컴파일러는 recordtype='stream'을 허용 할 수 있습니다 : 당신이 스트림 액세스를 사용할 수없는 경우, 당신이 직접 액세스를 사용할 필요가

open (id, file=file_name, status='old', form='unformatted' & 
     , access='stream', iostat=ios) 
! read (id, pos=1) someValue 
+0

Intel 컴파일러에서 recl이 4 바이트 단어로 지정되도록 지정해 주셔서 감사합니다. 나는 인텔 문서에서 이상하게 언급 된 것을 발견 할 수 없었다. – umbersar

1

. 대답 : this question에 대한 링크를 참조하십시오.