Почему BASIC добавляет 0x1a в конец файла?

Я пытаюсь передать файлы на старый PCjr через нуль-модемный последовательный кабель. Я создал быстрый сценарий BASIC для чтения данных из последовательного порта и записи их в файл, но я обнаружил, что каждый сохраняемый файл имеет в конце дополнительный байт 0x1a.

Похоже, это вызвано оператором CLOSE, так как даже OPENing и CLOSEing файл без записи чего-либо приводит к однобайтовому файлу.

Мне не нужен символ SUB в конце моих файлов, особенно двоичных! Есть ли альтернативный способ записи файлов, предотвращающий такое поведение?

(Использование отличного «PC-BASIC» в виртуальной машине Lubuntu для демонстрации, но, похоже, "вещь" во всех вариантах BASIC)

josh2112@jf334-lubuntu-vm:~$ pcbasic -b
PC-BASIC 2.0.0                                                                  
(C) Copyright 2013--2018 Rob Hagemans.                                          
60300 Bytes free                                                                
Ok                                                                              
OPEN "O",#1,"TEST.TXT":PRINT#1,"hello world";:CLOSE:SYSTEM                      
josh2112@jf334-lubuntu-vm:~$ xxd TEST.TXT 
00000000: 6865 6c6c 6f20 776f 726c 641a            hello world.

person josh2112    schedule 18.10.2018    source источник
comment
CHR$(&H1A) - это символ EOF (конец файла). Автор (?) PC-BASIC сказал следующее о добавлении поддержки для исключения символов EOF: Извините, у меня нет планов расширять синтаксис PC-BASIC или OPEN за пределы возможностей GW-BASIC - Я сосредоточен на максимальной совместимости с существующими программами. Возможно, вы могли бы использовать сценарий оболочки (или Python, или сам JS), чтобы удалить маркер конца файла & h1A из файлов, создаваемых вашей программой?   -  person Michael    schedule 18.10.2018
comment
Я также не хотел бы, чтобы PC-BASIC отклонялся от GW-BASIC; Я просто использовал это для демонстрации. Мой вопрос: есть ли в языке BASIC способ обойти это поведение, которое я мог бы применить к коду на моем PCjr? Python и JavaScript, конечно же, там работать не будут!   -  person josh2112    schedule 18.10.2018
comment
Может быть, это поможет: stackoverflow.com/questions/9699976/. В сообщении обсуждается, как DOS обрабатывает копирование данных с индикатором EOF и как работают флаги. Не могли бы вы пакетное копирование файлов с указанными переключателями?   -  person Doug Dawson    schedule 18.10.2018
comment
@DougDawson звучит так, как будто это может сработать, сегодня вечером я посмотрю, поддерживает ли версия DOS на PCjr (2.10) эти переключатели в своей команде копирования.   -  person josh2112    schedule 18.10.2018
comment
@DougDawson работает! Если вы сделаете ответ из своего комментария, я приму его.   -  person josh2112    schedule 19.10.2018
comment
Вы можете открыть двоичный файл и записывать каждый символ один за другим.   -  person eoredson    schedule 06.11.2018


Ответы (2)


Может быть, это поможет:

Пакетный сценарий для объединения файлов без шестнадцатеричных символов 1А в конце

В сообщении обсуждается, как DOS обрабатывает копирование данных с индикатором EOF и как работают флаги. Не могли бы вы пакетное копирование файлов с указанными переключателями?

РЕДАКТИРОВАТЬ по автору вопроса: да, это все. Требуется конкретная команда copy src.bin /a dest.bin /b. Это удаляет байт EOF из конца файла. Это даже поддерживалось еще в DOS 2.10! Раздражает, что я должен выполнить этот дополнительный шаг после использования моей программы BASIC для сохранения файла, но он выполняет свою работу.

person Doug Dawson    schedule 19.10.2018

Функция для записи строки в файл вывода данных без завершающего символа eof:

OPEN "B", #1, "TEST.TXT"
X$ = "hello world"
FOR X = 1 TO LEN(X$)
    Z$ = MID$(X$, X, 1)
    PUT #1, X, Z$
NEXT
person eoredson    schedule 06.11.2018
comment
Никогда не слышал о переключателе B, и мой PCjr 1983 года тоже никогда о нем не слышал. - person josh2112; 06.11.2018
comment
Хм, если это так, то всегда будет добавляться eof. - person eoredson; 07.11.2018