Вопрос

Я был поручено написать программу сбора данных для Unitech HT630., который запускает собственную операционную систему DOS, которая может запустить исполняемые файлы, компилируемые для 16-битных MS DOS с некоторыми ограничениями. Я использую компилятор Digital Mars C / C ++, который хорошо работает.

Одним из требований к применению является то, что файл данных должен быть читаемый человеком простой текст, что означает, что файл может быть импортирован в Excel или открывается Notepad. Я использую формат записи переменной длины, как CSV, который я успешно реализован с использованием функций ввода / вывода стандартных файлов библиотеки.

При сохранении записи я должен рассчитать, будет ли обновленная запись больше или меньше версии записи, в настоящее время в файле данных. Если больше, я сначала переключаю все записи сразу после текущей записи вперед по разнице размера, рассчитанную перед сохранением обновленной записи. EOF продлен автоматически путем ОС для удовлетворения дополнительных данных. Если меньше, я переключаю все записи назад от моего рассчитанного смещения. Это работает хорошо, однако я не нашел способа изменить маркер EOF или размер файла, чтобы игнорировать данные после окончания последней записи.

Большинство временных записей будут расти по размеру, потому что программа сбора данных будет заполнять некоторые пустые поля с данными при сохранении записи. Записи будут сокращаться только по размеру, когда коррекция выполнена на существующей записи, или на нормальной записи, если описательные данные в записи дольше, чем то, что программа читает в памяти.

В ситуации сжимающейся записи после последней записи в файле я остался любыми данными, которые там сидели перед сдвигом. Я пишу разделитель EOF в файл после того, как «сокращающийся запись сохранения», чтобы сигнал, когда конец моих записей и заполнения пробелов оставшихся данных, но тогда у меня больше нет чистого файла до «растущей записи сохранения». Расширяет размер файла над заполненной космической областью. То truncate() функция внутри unistd.h Не работает (теперь я думаю, что это только для * никса вкусы?).

Одним из предложенных решений, которые я видел, включает в себя создание второго файла и записи всех данных, которые вы хотите сохранить это Файл, а затем удаление оригинала. Поскольку у меня есть только 4 МБ для дискового пространства в 4 МБ, это работает, если размер файла меньше 2 МБ минус размером моей программы исполняемых файлов и файлов конфигурации, но потерпит неудачу иначе. Очень вероятно, что когда это вступит в производство, пользователи будут в конечном итоге с файлом, превышающим 2 МБ в размере.

Я посмотрел Список прерываний Ральфа Брауна и ссылка прерывания в IBM PC Assumber язык и программирование И я не могу найти что-либо, чтобы обновить размер файла или аналогичным.

Уменьшает размер файла без создания второго файла, даже возможно даже в DOS?

Это было полезно?

Решение

Чтобы уменьшить размер файла в DOS, вы стремитесь к точке усечения с int 21 (ax=4200h, bx=handle, cx:dx=offset) и позвонить писать с нулевой длиной: int 21 (ax=4000h, bx=handle, cx=0 (Значит урезанный))

Другие советы

В качестве альтернативы переключения записей вокруг при возмещении записи вы можете завершить каждую запись с помощью поля «PAD», который прокладывает его на стандартный размер (например, с пробелами или аналогичными).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top