Модуль в базе данных, перенос строки из одного файла в другой - Pascal ABC
Формулировка задачи:
Добрый вечер. Делаю свою первую базу данных на pascal , в ней есть функция архив . Архив - все записи которые мы удалили переносятся в новый файл . Так вот , у меня не получается в удалении перенести строчку n из файла a в файл b. Подскажите как это сделать .
Очень нужно сделать это
Решение задачи: «Модуль в базе данных, перенос строки из одного файла в другой»
textual
Листинг программы
procedure udalenie (var a, b: ft); var n, i: longint; c: string; e: FIO; begin repeat {цикл для удаления записей} {clrscr;} {эту строку считаю лишней} reset(a); {если файл до выполнения вызова процедуры уже открыт для чтения, эту строку можно удалить} reset(b); {аналогично предыдущему комментарию} if filesize(a) > 0 {проверяем, есть ли записи в файле} then begin {если записи в файле есть, действуем по плану} repeat {ввод номера записи с проверкой на существование} write('Введите номер записи, которую хотите удалить: '); readln(n); if (n < 1) or (n > filesize(a)) then writeln('Записи с таким номером нет, повторите ввод.') until (n >= 1) and (n <= filesize(a)); seek(a, n - 1); {n - 1 потому, что нумерация записей в файле всегда начинается с 0} read(a, e); {читаем запись из файла} seek(b, filesize(b)); {позиция в архивном файле - за последней записью} write(b, e); {пишем (в конец файла)} seek(a, filesize(a) - 1); {позиционируем на последнюю запись - нужно для случая, если в файле только 1 запись} {цикл выполнится хотя бы 1 раз, если количество записей > 1} for i := n - 1 to filesize(a) - 2 do {существующая позиция в файле может быть в интервале 0..filesize(a) - 1} begin seek(a, i + 1); {позиционируем на позицию i+1} read(a, e); {читаем} seek(a, i); {позиционируем на позицию i} write(a, e) {пишем, заодно и стираем то, что там было} end; truncate(a); {усекаем последнюю запись файла} end else writeln('Файл не содержит записей, удалять нечего.'); {если записей в файле нет, печатаем сообщение} write('0 - выйти, любой символ - продолжить: '); readln(c); until c = '0' end;
Объяснение кода листинга программы
- Создание переменной
a
типаft
(файловый указатель). - Создание переменной
b
типаft
(файловый указатель). - Создание переменной
n
типаlongint
(бесконечный цикл). - Создание переменной
i
типаlongint
(индекс для чтения и записи в файлы). - Создание переменной
c
типаstring
(строка для ввода и вывода). - Создание переменной
e
типаFIO
(потоковый объект для чтения и записи в файлы). - Цикл
repeat
для удаления записей из файла. - Проверка, есть ли записи в файле
a
. - Если есть записи, повторяем цикл до тех пор, пока не будет введена правильная последовательность номеров записей.
- Ввод номера записи с помощью функции
readln
. - Проверка введенного номера записи.
- Чтение записи из файла
a
в переменнуюe
. - Позиционирование файла
b
на конец файла. - Запись записи из файла
a
в файлb
. - Позиционирование файла
a
на конец файла. - Удаление последней записи из файла
a
с помощью функцииtruncate
. - Проверка, были ли изменены какие-либо записи в файле
a
. - Вывод сообщения об успешном выполнении или ошибке.
- Ожидание ввода пользователя.
- Выход из программы при вводе
0
.