作为第一个项目,我一直在编写一个简短的程序来渲染 Mandelbrot 分形。我已经到了尝试将我的结果输出到文件(例如 .bmp 或 .ppm )的地步,但被卡住了。
我还没有真正找到任何我想要做的事情的例子,但是我找到了两个从一个文件复制到另一个文件的代码示例。
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 文件字的实际工作原理,我将不胜感激,因为我的调查不断导致一些奇怪的堆栈。
关于 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的帮助。