在 Forth 上将文本文件写入数组

Writing a text file into an array on Forth

我有一个文本文件,其中包含一组数字,例如:

1 0 0 1 0
0 1 1 0 1
0 0 0 1 1
1 1 0 0 0
0 0 1 0 0

我打开了包含以下代码的文本文件:

variable file-id
: open_file ( -- ) \ Opens the text file
  s" c:\etc\textfile.txt" r/w open-file throw
  file-id ! ;

我还创建了一个数组来存储这些数据:

create an_array 25 chars allot \ Create the array

: reset_array ( -- ) big_array 25 0 fill ;
reset_array \ Set all elements to 0

有没有办法用 Forth 将文本文件的内容写入数组?

1。偷懒的方式

一种懒惰的方法是通过对文件名执行 included 来评估文件。

\ Some library-level common words
\ --------------------------------

\ Store n chars from the stack into the array at c-addr, n >= 0
: c!n ( n*x n c-addr -- )
  >r begin dup while ( i*x i )
    \ store top from i*x into addr+(i-1)*char_size
    1- tuck chars r@ + c! ( j*x j )
  repeat drop rdrop
;

\ Execute xt and produce changing in the stack depth
: execute-balance ( i*x xt -- j*x n ) depth 1- >r execute depth r> - ;

: included-balance ( i*x c-addr u -- j*x n )
  ['] included execute-balance 2 +
;

\ The program
\ --------------------------------

create myarray 25 chars allot \ Create the array

: read-myfile-numbers ( -- i*x i )
  state @ abort" Error: only for interpretation"
  s" ./mynumbers.txt" included-balance
;
: write-myarray ( i*x i -- )
  dup 25 <> abort" Error: exactly 25 numbers are expected"
  myarray c!n
;
: fill-myarray-from-myfile ( -- )
  read-myfile-numbers write-myarray
;

2。整洁的方式

一个谨慎的方法是 读取文件(完整或逐行),将文本拆分为词素,将词素转换为数字,然后将数字存储到数组中。

参见:

在低级别上,它可以通过 read-file or read-line, something like word|tail and >number(或上面示例中的 StoN 库字之类的东西)来完成。

在更高层次上:使用 Gforth 特定的词,例如 execute-parsingexecute-parsing-file, parse-name and s>number?

: next-lexeme ( -- c-addr u|0 )
  begin parse-name ?dup if exit then ( addr )
    refill 0= if 0 exit then drop
  again
;
: read-myfile-numbers ( -- i*x i )
  s" ./mynumbers.txt" r/o open-file throw
  [:
    0 begin next-lexeme dup while
      s>number? 0= abort" Error: NaN" d>s swap 1+
    repeat 2drop
  ;] execute-parsing-file
;

如果需要读取的数太多,只能一次一个一个的写入数组,而不是全部入栈。