4

最初のプロジェクトとして、マンデルブロー フラクタルをレンダリングする短いプログラムを作成しました。結果をファイル (例: .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に再び感謝します。

4

2 に答える 2

1

write-lineこの簡単な例でどのように機能するかを説明しようとします。ここに、文字列「hello」を含むバッファがあり、それを で開いたファイルに書き込みたいとしますopen-output

buffer 5 fd-out write-line

5 はバッファの長さです。fd-out開いているファイル ハンドルです。への呼び出しwrite-lineは整数の結果をスタックに残し、その値は実装に依存します。ファイル I/O ワードの詳細については、ファイル アクセス ワードを参照してください。

単語の呼び出しthrowはオプションです。スタックの一番上にある整数値をチェックし、その値に基づいて、例外スタックから一番上の例外フレームをポップするかabort、整数に関連付けられた条件に関する情報を提供する実装依存のメッセージを呼び出すか表示します。(作品がどのようにTHROWthrowで見つかるかについての正確な詳細)。

于 2010-12-20T10:10:48.787 に答える