Вывод файла с использованием Gforth - PullRequest
4 голосов
/ 19 декабря 2010

В качестве первого проекта я писал короткую программу для рендеринга фрактала Мандельброта.Я дошел до того, что пытался вывести свои результаты в файл (например, .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 -file на самом делеработа, поскольку мое расследование продолжает приводить к несколько странным стекам.

Любые подсказки относительно того, почему примеры 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 сработал бы, если бы я следовал инструкциям.

Еще раз спасибо Виджай за помощь.

Ответы [ 2 ]

1 голос
/ 20 декабря 2010

Я попытаюсь объяснить, как write-line работает с этим простым примером.Здесь у нас есть буфер, содержащий строку «hello», и мы хотим записать его в файл, открытый с open-output.

buffer 5 fd-out write-line

5 - длина буфера.fd-out - дескриптор открытого файла.Вызов write-line оставит целочисленный результат в стеке, значение которого зависит от реализации.Более подробную информацию о словах ввода-вывода файла можно найти в Слова доступа к файлу .

Вызов слова throw необязателен.Он будет проверять целочисленное значение в верхней части стека и на основе этого значения либо извлекает самый верхний кадр исключений из стека исключений, либо вызывает abort, либо отображает зависящее от реализации сообщение, дающее информацию об условии, связанном с целым числом.(Точные подробности о том, как работает throw, можно найти в THROW ).

0 голосов
/ 12 июля 2018

Ваша программа не завершена, что затрудняет ответ на вопрос.

С предварительным

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

и последующим

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

и после создания тестового файлаВпервые первая программа работает на Debian без ошибок.

Возможно, ваша проблема вызвана неправильным закрытием файла после записи.

...