file-io - 使用 Gforth 输出文件

标签 file-io bitmap forth mandelbrot

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

相关文章:

Android - 多次使用图像资源但仅在 1 个实例上更改 alpha

java - Bitmap 对象是否通过引用保存在内存中?

stack - Forth 实现使用系统堆栈作为返回堆栈是否可行?

c++ - 如何使用 shared_ptr 和 SWIG 避免内存泄漏

python - 写入多个流的包装器

file-io - TensorFlow 操作 'tf.train.match_filenames_once ' 不起作用

android - 如何将自定义 View 转换为位图?

forth - Forth 中的词重定义

forth - 在 Forth 中使用常量命名硬件地址

PHP file_get_contents 超时 "local file"(NFS/挂载)