为什么 BASIC 将 0x1a 附加到文件末尾?

Why does BASIC append 0x1a to the end of a file?

我正在尝试通过零调制解调器串行电缆将文件传输到旧的 PCjr。我拼凑了一个快速的 BASIC 脚本来从串行端口读取数据并将其写入文件,但我发现我保存的每个文件最后都有一个额外的字节 0x1a。

这似乎是由 CLOSE 语句引起的,因为即使 OPENing 和 CLOSEing 一个文件而不写入任何内容也会导致一个单字节文件。

我不想在文件末尾使用 SUB 字符,尤其是二进制文件!是否有另一种写入文件的方法可以防止这种行为?

(在 Lubuntu VM 中使用优秀的 "PC-BASIC" 进行演示,但这似乎是 BASIC 所有变体中的 "thing")

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.

也许这可以帮助:

Batch script to merge files without Hex char 1A at the end

post 讨论了 DOS 如何使用 EOF 指示器处理复制数据以及标志如何工作。您可以使用指示的开关批量复制文件吗?

问题作者编辑:是的,就是这样。需要的具体命令是 copy src.bin /a dest.bin /b。这从文件末尾剥离了 EOF 字节。这甚至在 DOS 2.10 中得到支持!烦人的是,在使用我的 BASIC 程序保存文件后,我必须 运行 这个额外的步骤,但它完成了工作。

将字符串写入数据输出文件且不带尾随 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