作为第一个项目,我一直在编写一个简短的程序来渲染 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 输出到一个文件,到目前为止一直受阻。任何人都可以提供任何帮助吗?
谢谢维杰 ,我想我理解你给出的例子。但是,当我尝试使用这样的东西(我认为是相似的)时:
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 文档示例就会起作用。再次感谢 维杰 为了帮助。
最佳答案
我将尝试解释如何write-line
使用这个简单的例子。这里我们有一个包含字符串“hello”的缓冲区,我们想把它写入一个用 open-output
打开的文件中。 .
buffer 5 fd-out write-line
5 是缓冲区的长度。
fd-out
是打开的文件句柄。调用 write-line
将在堆栈上留下一个整数结果,其值取决于实现。有关文件 I/O 字的更多信息可以在 File Access words 中找到。 .打字
throw
是可选的。它将检查堆栈顶部的整数值,并根据该值从异常堆栈中弹出最顶部的异常帧或调用 abort
或显示与实现相关的消息,提供有关与整数关联的条件的信息。 (可以在 THROW 中找到有关 throw
如何工作的确切详细信息)。
关于file-io - 使用 Gforth 输出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4480456/