最初のプロジェクトとして、マンデルブロー フラクタルをレンダリングする短いプログラムを作成しました。結果をファイル (例: .bmp または .ppm ) に出力しようとして行き詰まりました。
私がやろうとしていることの正確な例は実際には見つかりませんでしたが、あるファイルから別のファイルにコピーするコードの例を 2 つ見つけました。
Gforth のドキュメント (セクション 3.27) の例は、私 ( winXP ) では機能しませんでした。
これは、あるファイルの内容を別のファイルにコピーする Gforth ドキュメントの例です。
0 Value fd-in
0 Value fd-out
: open-input ( addr u -- ) r/o open-file throw to fd-in ;
: open-output ( addr u -- ) w/o create-file throw to fd-out ;
s" foo.in" open-input
s" foo.out" open-output
: copy-file ( -- )
begin
line-buffer max-line fd-in read-line throw
while
line-buffer swap fd-out write-line throw
repeat ;
動作するこの例 ( http://rosettacode.org/wiki/File_IO#Forth ) を見つけました。主な問題は、ファイルに書き込む部分を分離して、まだ機能させることができないことです。主な混乱は、>r が期待どおりに TOS を消費していないように見えることです。
: copy-file2 ( a1 n1 a2 n2 -- )
r/o open-file throw >r
w/o create-file throw r>
begin
pad maxstring 2 pick read-file throw
?dup while
pad swap 3 pick write-file throw
repeat
close-file throw
close-file throw ;
\ Invoke it like this:
s" output.txt" s" input.txt" copy-file
open 、 create read 、 write -file の単語が実際にどのように機能するかを誰かが正確に説明できれば、非常に感謝しています。
Gforth の例が機能しない理由についての手がかりも役立つかもしれません。
まとめると、Gforthからファイルに出力したいのですが、今のところ挫折しています。誰でも助けを提供できますか?
Vijayさん、ありがとうございます。あなたの例は理解できたと思います。ただし、次のようなものを使用しようとすると(似ていると思います):
0 value test-file
: write-test
s" testfile.out" w/o create-file throw to test-file
s" test text" test-file write-line ;
取得ok
しましたが、ファイルに何も入れられませんでした。間違いを犯しましたか?
問題は、関連するバッファをフラッシュしていないか、ファイルを明示的に閉じていないことが原因のようです。のようなものを追加する
test-file flush-file throw
また
test-file close-file throw
の間write-line
で;
それを機能させます。したがって、指示に従っていれば、Gforth のドキュメントの例は機能していたはずです。
助けてくれたVijayに再び感謝します。