Мне поручили написать программу сбора данных для Unitech. HT630, который работает под управлением проприетарной операционной системы DOS и может запускать исполняемые файлы, скомпилированные для 16-разрядной версии MS DOS, с некоторыми ограничениями. Я использую компилятор Digital Mars C/C++, который до сих пор работает хорошо.
Одним из требований приложения является то, что файл данных должен быть удобочитаемым текстом, то есть файл можно импортировать в Excel или открыть в Блокноте. Я использую формат записи переменной длины, очень похожий на CSV, который я успешно реализовал с помощью функций ввода-вывода файлов стандартной библиотеки C.
При сохранении записи я должен вычислить, больше или меньше обновленная запись, чем версия записи, которая в данный момент находится в файле данных. Если больше, я сначала сдвигаю все записи сразу после текущей записи вперед на разницу в размерах, рассчитанную перед сохранением обновленной записи. EOF автоматически расширяется ОС для размещения дополнительных данных. Если меньше, я сдвигаю все записи назад на рассчитанное мной смещение. Это работает хорошо, однако я не нашел способа изменить маркер EOF или размер файла, чтобы игнорировать данные после окончания последней записи.
Большую часть времени записи будут увеличиваться в размере, потому что программа сбора данных будет заполнять некоторые пустые поля данными при сохранении записи. Записи будут уменьшаться в размере только при исправлении существующей записи или при обычном сохранении записи, если описательные данные в записи длиннее, чем то, что программа считывает в памяти.
В случае сокращения записи после последней записи в файле у меня остаются все данные, которые были там до сдвига. Я пишу разделитель EOF в файл после «сохранения записи с сокращением», чтобы сигнализировать, где конец моих записей, и заполняю оставшиеся данные, но тогда у меня больше нет чистого файла до «растущей записи». расширяет размер файла поверх заполненной области. Функция truncate()
в unistd.h
не работает (теперь я думаю, что это только для *nix-вариантов?).
Одно из предложенных решений, которое я видел, включает создание второго файла и запись всех данных, которые вы хотите сохранить, в этот файл, а затем удаление оригинала. Поскольку у меня есть только 4 МБ дискового пространства для использования, это работает, если размер файла меньше 2 МБ минус размер исполняемого файла моей программы и файлов конфигурации, но в противном случае это не удастся. Весьма вероятно, что когда это будет запущено в производство, пользователи получат файл размером более 2 МБ.
Я просмотрел список прерываний Ральфа Брауна и ссылку на прерывание в Язык ассемблера IBM PC и программирование, и я не могу найти ничего, обновить размер файла или подобное.
Возможно ли уменьшение размера файла без создания второго файла в DOS?