File Troubles

0 views
Skip to first unread message

Sergey Karakovskiy

unread,
Mar 26, 2008, 10:06:44 AM3/26/08
to Forth On TOP @ AMCP
Hello Forth,

Почему этот

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

Michael Gasanenko

unread,
Apr 2, 2008, 8:47:51 AM4/2/08
to Forth On TOP @ AMCP
http://www.complang.tuwien.ac.at/forth/dpans-html/dpans11.htm#11.6.1.2090

Up to two implementation-defined line-terminating characters may be
read into memory at the end of the line, but are not included in the
count u2. The line buffer provided by c-addr should be at least u1+2
characters long.

Reply all
Reply to author
Forward
0 new messages