Вопрос № 39826: Здравствуйте, Эксперты!
Такая проблема: имеется файл ввиде таблице о сведении учеников, в которой первый столбик-номер ученика, второй- его фамилия, третий-его имя и четвертый-его возраст. Как можно добавить в этот файлы новые записи, без стриран...
Вопрос № 39.826
Здравствуйте, Эксперты!
Такая проблема: имеется файл ввиде таблице о сведении учеников, в которой первый столбик-номер ученика, второй- его фамилия, третий-его имя и четвертый-его возраст. Как можно добавить в этот файлы новые записи, без стрирания старых (процедура append отказывается это делать)? Как можно отсортировать таблицу по номеру ученика в порядке возрастания, не теряя связь с другими столбцами?
Смотрите приложение.
Спасибо за внимание.
Отвечает: Полховский Александр Владимирович
Здравствуйте, Иванов Евгений Андреевич! Append работает с текстовыми файлами (var ... :TextFile). Поэтому Вам необходимо либо изменить подход к чтению/записи (т.е. работать с ним, как с текстовым, то есть и объявить его как текстовый), либо пользоваться процедурой reset, предварительно назначив глобальной переменной FileMode режим записи (подробнее в справке), и перейти к концу файла (seek(FileSize(F))). А затем дописывать всё, что нужно.
По сортировке: всё зависит от выбранного Вами алгоритма сортировки. В любом случае манипулировать Вы будете целыми строками, а не значениями в первом столбце. Советую сразу записывать в отсортированном виде. Тогда не надо будет обрабатывать все записи файла. А чтобы записывать в отсортированном виде, надо создать временый файл (ну или выполнить всё в памяти, первое легче. по-моему), и записывать туда все строки в том порядке, в котором нам нужно. При этом записать добавляемую строку в нужное место.
--------- Спасём нашу хрупкую планету !
Отвечает: Устинов Сергей Евгеньевич
Здравствуйте, Иванов Евгений Андреевич!
Append работает только с текстовыми файлами (а не типизированными, как у Вас).
Добавлять записи можно так, как показано в приложении.
При сортировке Вы будете сравнивать по какому-то полю, а менять местами записи, таким образом целостность сохранится.
Как Вам уже сказали, считаю нужным для сортировки создавать временный файл.
Приложение:
Ответ отправил: Устинов Сергей Евгеньевич (статус: 3-ий класс)
Ответ отправлен: 09.04.2006, 23:41 Оценка за ответ: 5 Комментарий оценки: Спасибо за быстрый ответ. Но можно еще попросить уточнить по
поводу сортировки? Вы не могли бы привести свой пример?
Отвечает: shegeda
Здравствуйте, Иванов Евгений Андреевич!
Будем считать, что наша таблица - это поле для лабораторной работы на тему "Файлы и файловые функции, методы сортировки". И не более того. никаких оптимизаций чтения-записи, никакого кеширования, никаких индексов. Тогда задача упростится.
Судя по фрагменту кода, используется типизированный файл, а описание ошибки, возникающей при вызове Append - лишнее тому подтверждение. Тогда наша задача упрощается, поскольку мы можем свободно перемещаться на любую запись в таблице, используя функцию Seek(f, newPos). Определить количество записей в таблице можно функцией FileSize(f). Таким образом, чтобы добавить новые записи в конец файла, нужно предварительно выполнить одну строку кода:
Seek(fs, FileSize(fs));
С сортировкой немного сложнее, однако, не смертельно. Воспользуемся методом "стакана", когда перебираются все места от начала до конца, и на текущее место ищется максимальное/минимальное значение из оставшихся.
Фрагмент кода в приложении
Приложение:
Ответ отправил: shegeda (статус: 5-ый класс)
Ответ отправлен: 10.04.2006, 02:36