我一直在为编写一个数据收集程序 Unitech HT630, ,它运行了专有的DOS操作系统,该操作系统可以运行为16位MS DOS编译的可执行文件,并有一些限制。我正在使用数字火星C/C ++编译器,该编译器到目前为止运行良好。

应用程序要求之一是数据文件必须是人类可读的纯文本,这意味着可以将文件导入到Excel中或由Notepad打开。我使用的是与CSV相似的可变长度记录格式,我使用C标准库文件I/O函数成功实现了CSV。

保存记录时,我必须计算更新的记录是否比当前数据文件中的记录版本大。如果较大,我首先在保存更新的记录之前通过计算的尺寸差异后立即将所有记录转移到当前记录之后。 EOF由OS自动扩展,以适应额外的数据。如果较小,我会以计算出的偏移向后移动所有记录。这很好,但是我找不到修改EOF标记或文件大小以忽略最后一个记录结束后的数据。

大多数时间记录的大小都会增长,因为数据收集程序将在保存记录时用数据填充一些空字段。记录只有在现有条目进行校正或在常规记录上进行校正时的大小会缩小,如果记录中的描述性数据比程序在内存中读取的数据更长,则记录将保存。

在缩小记录的情况下,在文件中的最后一个记录之后,我留下的任何数据都坐在班次前。在“缩小记录保存”之后,我一直在文件中写入EOF定界符,以指示我的记录的结尾在哪里并填充剩余的数据,但是直到“增长的记录保存”之前,我不再有一个干净的文件。扩展文件的大小在充满空间的区域上。这 truncate() 功能在 unistd.h 不起作用(我现在认为这仅适用于 *nix口味吗?)。

我见过的一种建议的解决方案涉及创建第二个文件并编写您希望保存到的所有数据 文件,然后删除原件。由于我只有4MB的使用磁盘空间,因此如果文件大小小于2MB,则可以使用程序可执行文件和配置文件的大小,但否则会失败。当这样进行生产时,用户很有可能最终会产生超过2MB的文件。

我看了看 拉尔夫·布朗的中断名单 以及中断参考 IBM PC组装语言和编程 而且我似乎找不到任何东西来更新文件大小或类似。

在不创建第二个文件的情况下,是否可以减少文件的大小?

有帮助吗?

解决方案

为了减少文件的大小,您可以寻求与 int 21 (ax=4200h, bx=handle, cx:dx=offset) 并以零长度写入写: int 21 (ax=4000h, bx=handle, cx=0 (意思是截断))

其他提示

作为调整记录大小的记录时,您可以使用“垫”字段完成每个记录的替代方案,该字段将其粘贴到标准尺寸(例如带有空格或类似)的标准尺寸。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top