我的任务是为Unitech HT630编写一个数据收集程序,它运行一个专有的 DOS 操作系统,可以运行为 16 位 MS DOS 编译的可执行文件,但有一些限制。我正在使用 Digital Mars C/C++ 编译器,它目前运行良好。
应用程序要求之一是数据文件必须是人类可读的纯文本,这意味着文件可以导入 Excel 或用记事本打开。我使用的可变长度记录格式很像 CSV,我已经使用 C 标准库文件 I/O 函数成功实现了这种格式。
保存记录时,我必须计算更新后的记录是大于还是小于数据文件中当前记录的版本。如果更大,我首先将当前记录之后的所有记录向前移动,按保存更新记录之前计算的大小差异。操作系统会自动扩展 EOF 以容纳额外的数据。如果更小,我将所有记录向后移动我计算的偏移量。这很好用,但是我发现无法修改 EOF 标记或文件大小以忽略最后一条记录结束后的数据。
大多数情况下,记录的大小会增加,因为数据收集程序会在保存记录时用数据填充一些空白字段。仅当对现有条目进行更正时,记录的大小才会缩小,或者如果记录中的描述性数据长于程序在内存中读取的数据,则在正常记录保存时会缩小记录的大小。
在记录缩小的情况下,在文件中的最后一条记录之后,我留下了班次之前坐在那里的任何数据。在“缩小记录保存”之后,我一直在文件中写入一个 EOF 分隔符,以指示我的记录的末尾在哪里并填充剩余数据的空间,但是在“增长记录保存”之前我不再有一个干净的文件在空间填充区域上扩展文件的大小。中的truncate()
功能unistd.h
不起作用(我现在认为这仅适用于 *nix 口味?)。
我见过的一个提议的解决方案涉及创建第二个文件并将您希望保存的所有数据写入该文件,然后删除原始文件。由于我只有 4MB 的磁盘空间可供使用,因此如果文件大小小于 2MB 减去我的程序可执行文件和配置文件的大小,则此方法有效,否则会失败。很有可能当它投入生产时,用户最终会得到一个超过 2MB 的文件。
我查看了Ralph Brown 的中断列表和IBM PC 汇编语言和编程中的中断参考,我似乎找不到任何可以更新文件大小或类似内容的东西。
在 DOS 中甚至可以在不创建第二个文件的情况下减小文件的大小吗?