4

作为第一个项目,我一直在编写一个简短的程序来渲染 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的帮助。

4

2 回答 2

1

我将尝试解释如何write-line使用这个简单的示例。这里我们有一个包含字符串“hello”的缓冲区,我们想将它写入一个用open-output.

buffer 5 fd-out write-line

5 是缓冲区的长度。fd-out是打开的文件句柄。调用write-line将在堆栈上留下一个整数结果,其值取决于实现。有关文件 I/O 字的更多信息,请参见文件访问字

调用这个词throw是可选的。它将检查堆栈顶部的整数值,并根据该值从异常堆栈中弹出最顶部的异常帧,或者调用abort或显示与实现相关的消息,提供有关与整数相关联的条件的信息。throw(有关如何在THROW中找到作品的确切细节)。

于 2010-12-20T10:10:48.787 回答
0

您的程序不完整,这使得问题难以回答。

带有前置

 1024 CONSTANT max-line
 CREATE line-buffer max-line 3 + ALLOT

和后挂

copy-file
fd-in close-file  throw
fd-out close-file  throw

在创建了一个测试文件 foo.in gforth 之后,第一个程序在 Debian 上完美运行。

可能您的问题是由于写入后未正确关闭文件引起的。

于 2018-07-12T14:01:41.490 回答