Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

**Обрезка файла при добавлении (append): решение проблемы с ASCII кодом 14 в Delphi 7**

Delphi , Базы данных , ASCII и CSV

Обрезка файла при добавлении (append): решение проблемы с ASCII кодом 14 в Delphi 7

При разработке программного обеспечения на Delphi 7, разработчики могут столкнуться с неожиданным поведением при работе с файлами в режиме добавления данных (append mode). В частности, была выявлена проблема, когда при использовании ASCII кода 14 (Shift Out) в конце файла, при попытке добавления новых данных, файл обрезается до начала этой записи. Это приводит к потере данных после символа с кодом 14.

Описание проблемы

Рассмотрим пример кода, который демонстрирует проблему:

var f: text;
begin
  assign(f, 'a.txt');
  rewrite(f);
  writeln(f, 'before' + chr(14) + 'after');
  close(f);

  assign(f, 'a.txt');
  append(f);
  close(f);
end.

Ожидается, что в файле a.txt будет записана строка "before#14after#13#10", а затем к ней ничего не будет добавлено. Однако, после выполнения программы в операционной системе Windows, в файле a.txt остается только "before", как будто функция добавления данных append обрезает файл. Если же не закрывать файл после первой записи, то данные записываются корректно, включая символы с кодом 14 и 13, которые соответствуют ASCII-завершению строки.

При добавлении новых данных в открытый файл, они добавляются, но как будто файл уже был обрезан перед этим. Например, если добавить строку " FooBar", то в файле появится только "beforeFooBar".

Это поведение не наблюдается при использовании других символов в диапазоне от 0 до 32, включая символ конца файла с кодом 26 (EOF).

Причины и решения

Исследование проблемы показало, что это может быть связано с ошибкой в Delphi 7. В документации по TextOpen указано, что если в последних 128 байтах файла присутствует символ Ctrl+Z (ASCII 26), то позиция записи в файл устанавливается так, что следующий добавленный символ перезапишет первый Ctrl+Z в блоке. Это сделано для совместимости с CP/M.

Однако, в исходном коде модуля System.pas из установки Delphi 7, обнаружено, что вместо использования константы cEof (которая равна 26) используется константа eof (которая, по ошибке, установлена равной 14). Это приводит к тому, что вместо специального случая для кода 26, система обрабатывает код 14 как символ конца файла.

Подтвержденное решение

Благодаря исследованиям, проведенным совместно с сообществом разработчиков, было выявлено, что проблема действительно связана с ошибкой в Delphi 7. В коде ассемблера для Windows в функции TextOpen (из Source/Rtl/Sys/System.pas, примерно на строке 4282) вместо использования правильного значения cEof используется значение eof, которое по ошибке установлено равным 14.

Для исправления этой ошибки необходимо изменить инструкцию сравнения на правильное значение cEof:

CMP     byte ptr [ESI].TTextRec.Buffer[EAX],cEof

Это позволит корректно обрабатывать символы в конце файла и избежать обрезки файла при добавлении данных.

Заключение

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

Создано по материалам из источника по ссылке.

При разработке на Delphi 7 возникла проблема, когда при добавлении данных в файл в режиме append, файл обрезается до символа с ASCII кодом 14, что приводит к потере данных.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: ASCII и CSV ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-22 09:39:58/0.005918025970459/1