4

Fortran 90 プログラムでフォーマットされていない (バイナリ) データを STDOUT に書き込みたいと考えています。私は AIX Unix を使用していますが、残念ながらユニット 6 を「未フォーマット」として開くことはできません。/dev/stdout代わりに別のユニット番号で開いてみようと思いました/dev/stdoutが、AIX には存在しません (ただし、この方法は Linux では機能しました)。

基本的に、プログラムの出力を別のプログラムに直接パイプして、中間ファイルを持たないようにしたいと考えてgzip -cいます。上記で遭遇した2つの問題を考慮して、これを達成できる他の方法はありますか?

4

2 に答える 2

2

TRANSFER()データを長い文字に変換し、それをノンアドバンシング I/O で出力しようとします。問題は、レコード長に対するプロセッサの制限です。短すぎると、予想外の記録終了サインがどこかにあることになります。また、プロセッサが印刷できない文字を希望どおりに書き込めない場合があります。

つまり、次のようなもの

character(len=max_length) :: buffer

buffer = transfer(data,buffer)

write(*,'(a)',advance='no') trim(buffer)

印刷できない文字に見られる最大の問題。前進していない I/O に関するサプライズも参照してください。

---EDIT--- 別の可能性として、file/proc/self/fd/1または/dev/fd/1

テスト:

open(11,file='/proc/self/fd/1',access='stream',action='write')
write(11) 11
write(11) 1.1
close(11)
end
于 2012-10-23T10:18:36.473 に答える
1

これは、新しい回答というよりも@VladimirFへのコメント/追加ですが、まだ追加できません。最初に事前接続された I/O ユニットの場所を調べてから、フォーマットされていない接続を開くことができます。

character(1024) :: stdout
inquire(6, name = stdout)
open(11, file = stdout, access = 'stream', action = 'write')

これはおそらく最も便利な方法ですが、Fortran 2003 の機能であるストリーム アクセスを使用します。これがないと、シーケンシャル アクセス (各レコードにヘッダー データを追加する) または直接アクセス (ヘッダーを追加しないが固定レコード長が必要) しか使用できません。

于 2012-10-23T13:38:43.023 に答える