f95 には、Fortran 2003 規格の新しいストリーム入出力スキームが実装されています。ストリーム入出力アクセスは、データファイルを、1 から始まる正の整数でアドレス指定できる連続バイト列として扱います。OPEN 文で、ストリーム入出力を、ACCESS='STREAM' 指定子をつけて宣言してください。バイトアドレスへファイルを位置付けると、READ または WRITE 文に POS=scalar_integer_expression 指定子が必要になります。 INQUIRE 文では、ACCESS='STREAM'、指定子 STREAM=scalar_character_variable、および POS=scalar_integer_variable が使用できます。
ストリーム入出力は、C プログラムで作成するファイルまたは読み取るファイルと相互に運用する場合に便利です。次にその例を示します。
C の fwrite() で作成したファイルを Fortran 95 プログラムで読み取る program reader integer:: a(1024), i, result open(file="test", unit=8, access="stream",form="unformatted") ! a のすべてを読み取る read(8) a do i = 1,1024 if (a(i) .ne. i-1) print *,'error at ', i enddo ! ファイルを逆方向に読み取る do i = 1024,1,-1 read(8, pos=(i-1)*4+1) result if (result .ne. i-1) print *,'error at ', i enddo close(8) end C プログラムでファイルに書き込む #include <stdio.h> int binary_data[1024]; /* 32 ビットの整数を 1024 個含むファイルを作成する */ int main(void) { int i; FILE *fp; for (i = 0; i < 1024; ++i) binary_data[i] = i; fp = fopen("test", "w"); fwrite(binary_data, sizeof(binary_data), 1, fp); fclose(fp); } |
C プログラムでは、fwrite() を使用して、ファイルに 1024 個の 32 ビット整数を書き込んでいます。Fortran 95 のプログラム読み取りは、これらの整数をまず配列として読み込んでから、ファイルの最後から先頭まで逆方向に個々の整数を読み込んでいます。2 番目の read 文に含まれる pos= 指定子を見ると、位置がバイト 1 から始まるバイト数で指定されていることがわかります (C では、バイト 0 から始まります)。