2010-12-12 7 views
0

FORMATのようなステートメント(FORTRANライブラリを使用しない理由があります)を使用して、Fortran入出力用のプリプロセッサとポストプロセッサを作成しています。新しい行( "/")文字を正しく扱いたい。 Fortranコンパイラをすぐに手に入れることはできません。 (この記事は、ちょうど読ん例を示します)FORMATステートメントで改行を読む

[FORTRANのコードでFORTRAN77のような考え方を前提とし、私の部分に任意のFORTRAN構文を修正してください]

書かれたり消費されているどのように多くの改行ワークアウトのための単純なアルゴリズムがあります

更新:まだコメントがありませんので、コンパイラを見つけてそれを自分で実行することになります。私はそれに殴られていない場合、私は答えを投稿します。誰も私は書式の構文が間違っていたとコメントしました。私は、(a)は、READコマンドは、常に改行を消費しない...など、データ・ファイル1

a 
b 
c 
d 

を想定

それを変更しましたが、まだエラー

があるかもしれませんか?

READ(1, '(A)') A 
READ(1, '(A)') B 

所与のA = 'A' およびB = 'B' 行い

(B)

READ(1,'(A,/)') A 
READ(1,'(A)') B 

はBのために与えませんか?

READ(1, '(/)') 
READ(1, '(A)') A 

何(D)

(それが 'B' または 'C' である)のために与えて何をするか

(c)は(私が 'C' を前提とします)

READ(1,'(A,/,A)') A, B 
READ(1,'(A)') C 

AとBとCのために与える

を何

(E)(Iは 'A' と 'B' と 'C' をとることができます)

READ(1,'(A,/,/,A)') A, B 
READ(1,'(A)') C 

はAとBとCに与えます(「a」と「c」と「d」と仮定できますか)?

「/」が冗長な場合はありますか?

答えて

2

正確には、スラッシュ編集記述子は、文字/で表され、実際はレコード指定子の終わりです。私は今、Fortran 2008標準のドラフトを引用するつもりですが、FORTRAN77以降、プログラミング言語の動作がこの点で変わったとは思いませんが、私は確信していません。私は標準から引用しています。なぜなら、(a)プリプロセッサとポストプロセッサを作成しているなら、私が提供できるすべてのあいまいな説明ではなく、標準に準拠させたいと思うでしょう。 b)FortranのI/Oステートメントには非常に多くのバリエーションがあり、私はそれらのうちのほんのいくつかのみに精通しています(そしてこれはその1つではありません)。

10.8.2スラッシュ編集

1スラッシュ編集記述子は、または現在のレコードからのデータ転送の終了を示します。

2順次アクセスまたはストリームアクセス用に接続されたファイルからの入力では、現在のレコードの残りの部分はスキップされ、ファイルは次のレコードの先頭に配置されます。このレコードは現在のレコードになります。シーケンシャルまたはストリームアクセス用に接続されたファイルへの出力時には、現在のレコードの後に​​新しい空のレコードが作成されます。この新しいレコードはファイルの最後および現在のレコードになり、ファイルはこの新しいレコードの先頭に配置されます。

3直接アクセス用に接続されたファイルの場合、レコード番号が1つ増え、そのレコード番号があるレコードの先頭にファイルが配置され、このレコードがあればこのレコードになります現在のレコード。

(注10.25何の文字が含まれていないレコードが出力に書き込むことができる。ファイルは、内部ファイルまたは直接アクセス用に接続されたファイルである場合は、レコードが空白文字で満たされている。全体のレコードはスキップしてもよいです

4スラッシュ編集記述子では、繰り返し指定はオプションです。指定されていない場合、デフォルト値は1です。

ので、スラッシュは(書き込み用を準用)部分的に読み、レコードの最後まで読み取り、完全にレコードをスキップするために使用することができます。

私はあなたのプログラムは(Mac OS X上のインテル®Fortran 11.1)をコンパイルする場合、私は次のような出力が得られます。

a                    
b                    
====== example b 
a                    
c                    
====== example c 
c                    
====== example d 
a                    
b                    
c                    
====== example e 
a                    
c                    
d                    
====== example f 
a                    
b                    

標準の私の解釈に基づいて、のgfortranは非標準の挙動を示す、ということを示唆しています。しかし、あなたのI/O操作がより具体的であれば、READとWRITEにレコード長を指定したいと思うかもしれないが、あなたが望むものを達成できるかもしれないと思う。

+0

ありがとう返事をするほど!なぜ3つの連結されているのですか?私は実際にJavaを使用して解析していますが、スラッシュが可能な限り処理されていることを確認したかったのです。 –

+0

ああ、混乱した出力については申し訳ありませんが、私はあなたの勝利と同じではない入力ファイルを使用しました。私は今それを修正しました。 –

0

これまでのコメントはありませんでしたが、自分の答えを追加しています。 (もし誰かがこれに光を加えれば、私は彼らに投票をするだろう)。

プログラム:のgfortranでコンパイル

program TEST 

    character (len=80) :: a,b,c 

    write(6,'(a)') '====== example a' 
    open(1,file='test1.dat',form='formatted',status='old',action='read') 

READ(1, '(A)') a 
READ(1, '(A)') b 
    write(6,'(a)') a 
    write(6,'(a)') b 

close(1) 

    write(6,'(a)') '====== example b' 
    open(1,file='test1.dat',form='formatted',status='old',action='read') 

READ(1, '(A,/)') a 
READ(1, '(A)') b 
    write(6,'(a)') a 
    write(6,'(a)') b 

close(1) 

    write(6,'(a)') '====== example c' 
    open(1,file='test1.dat',form='formatted',status='old',action='read') 

READ(1, '(/)') 
READ(1, '(A)') A 
    write(6,'(a)') a 

close(1) 

    write(6,'(a)') '====== example d' 
    open(1,file='test1.dat',form='formatted',status='old',action='read') 

READ(1, '(A,/,A)') a,b 
READ(1, '(A)') c 
    write(6,'(a)') a 
    write(6,'(a)') b 
    write(6,'(a)') c 

close(1) 

    write(6,'(a)') '====== example e' 
    open(1,file='test1.dat',form='formatted',status='old',action='read') 

READ(1,'(A,/,/,A)') a, b 
READ(1,'(A)') c 
    write(6,'(a)') a 
    write(6,'(a)') b 
    write(6,'(a)') c 

close(1) 

    write(6,'(a)') '====== example f' 
    open(1,file='test1.dat',form='formatted',status='old',action='read') 

READ(1, '(A1)') a 
READ(1, '(A1)') b 
    write(6,'(a)') a 
    write(6,'(a)') b 

close(1) 
end 

います:

gfortran -O2 -c test.f90 
gfortran -o test.x *.o 

C:\test>test.x 
====== example a 
a 

b 

====== example b 
a 

c 

====== example c 
c 

====== example d 
a 

b 

c 

====== example e 
a 

c 

d 

====== example f 
a 

b 

QUESTION: なぜ、すべての出力の間に追加の新しい行がありますか?読み込まれた文字列に改行がありますか?

0

これらの新しい行は、実際には79個の印刷スペースです。 書き込み(6、 '(a)')a(1:LEN_TRIM(a)) または文字フィールドの長さを(1)に変更してください。

関連する問題