Модуль в базе данных, перенос строки из одного файла в другой - 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;

Объяснение кода листинга программы

  1. Создание переменной a типа ft (файловый указатель).
  2. Создание переменной b типа ft (файловый указатель).
  3. Создание переменной n типа longint (бесконечный цикл).
  4. Создание переменной i типа longint (индекс для чтения и записи в файлы).
  5. Создание переменной c типа string (строка для ввода и вывода).
  6. Создание переменной e типа FIO (потоковый объект для чтения и записи в файлы).
  7. Цикл repeat для удаления записей из файла.
  8. Проверка, есть ли записи в файле a.
  9. Если есть записи, повторяем цикл до тех пор, пока не будет введена правильная последовательность номеров записей.
  10. Ввод номера записи с помощью функции readln.
  11. Проверка введенного номера записи.
  12. Чтение записи из файла a в переменную e.
  13. Позиционирование файла b на конец файла.
  14. Запись записи из файла a в файл b.
  15. Позиционирование файла a на конец файла.
  16. Удаление последней записи из файла a с помощью функции truncate.
  17. Проверка, были ли изменены какие-либо записи в файле a.
  18. Вывод сообщения об успешном выполнении или ошибке.
  19. Ожидание ввода пользователя.
  20. Выход из программы при вводе 0.

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы