Почему этот
0 value handle
: ?io ?dup if DUP ." i/o error " . cr throw then ;
: fopen ( addr len fam ) open-file ?io to handle ; \ fam = r/o r/w w/o -- r/o bin r/w bin w/o bin
: fread ( addr size -- len2 ) handle read-file ?io ;
: fwrite ( addr len -- ) handle write-file ?io ;
: freadline ( addr size -- len flag ) handle read-line ?io ;
: fclose ( -- ) handle close-file ?io ;
$200 constant /mybuf
create mybuf /mybuf allot
: test
S" w:\Projects\Forth\UtilVoc\ToSee\!\myfile2.txt" r/o fopen
begin
mybuf dup /mybuf ( addr addr size ) freadline ( addr len flag )
while ( addr len )
type cr
repeat
( addr len )
2drop
fclose
;
И этот код:
$200 constant /mybuf
create mybuf /mybuf allot
0 value handle
: ?io ?dup if DUP ." i/o error " . cr throw then ;
: fopen ( addr len fam ) open-file ?io to handle ; \ fam = r/o r/w w/o -- r/o bin r/w bin w/o bin
: fread ( addr size -- len2 ) handle read-file ?io ;
: fwrite ( addr len -- ) handle write-file ?io ;
: freadline ( addr size -- len flag ) handle read-line ?io ;
: fclose ( -- ) handle close-file ?io ;
: test
S" w:\Projects\Forth\myfile2.txt" r/o fopen
begin
mybuf dup /mybuf ( addr addr size ) freadline ( addr len flag )
while ( addr len )
type cr
repeat
( addr len )
2drop
fclose
;
Работают по-разному?! Результат такой:
Первый вариант выводит содержимое файла, всё ок, а во втором после
вывода первой строчки происходит ошибка ввода-вывода. Я же делаю
allot. Какая Форт-системе разница где. Поменять Here, да и всё.
Неужели отводить
память под буфер необходимо после определения всех слов в статье?
Я бы хотел, например, иметь такую функциональность:
: fin-readline>buf ( -- addr len flag )
buf dup buf-size fin-readline
;
Чтобы писать так:
S" w:\Projects\Forth\myfile2.txt" fin-open
begin
buf dup buf-size fin-readline
while
type cr
repeat
Вопрос:
Как так сделать?
Ну и совсем мистика, кстати:
$200 constant buf-size
create buf buf-size allot
: fin-readline>buf ( -- addr len flag )
buf dup buf-size fin-readline
;
: CountTotalWords
S" w:\Projects\Forth\myfile2.txt" fin-open
begin
buf dup buf-size fin-readline
\ fin-readline>buf
while
type cr
repeat
2drop
;
Это ^^^^^ работает отлично
А это улетает в бесконечный цикл:
$200 constant buf-size
create buf buf-size allot
: fin-readline>buf ( -- addr len flag )
buf dup buf-size fin-readline
;
: CountTotalWords
S" w:\Projects\Forth\myfile2.txt" fin-open
begin
\ buf dup buf-size fin-readline
fin-readline>buf
while
type cr
repeat
2drop
;
--
Best regards,
Sergey mailto:sergey.ka...@gmail.com