Работа с текстовыми файлами в языке Ада. Удаление строк и символов из файла

Предлагаю дополнительно рассмотреть возможность удаления из файлов строк и символов. Так как для реализации этой операции будут задействованы некоторые дополнительные пакеты, я решил вынести этот вопрос в отдельную тему. Для реализации используем файл, который у нас получился при решении последней задачи раздела "Работа с текстовыми файлами в языке Ада. Решение тематических задач", (телефонный справочник). Пусть он называется PhoneBook.txt. Будем считать, что в нём есть следующие записи:

Иванов
Иван
14-15-16
Васечкин
Петр
78-98-56
Петров
Василий
32-33-34
Писькунов
Жан-Поль Николаевич
55-55-55

Допустим, нам надо удалить из файла информацию о Васечкине Петре. Фактически это строки 4, 5, 6. Для поиска этих строк можно написать соответствующую функцию, но для простоты будем считать, что нам известны номера строк, которые нужно удалить. Программа удаления будет выглядеть примерно так:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Directories;
 
procedure main is
    Tmp_Ext : constant String := ".tmp"; --расширение временного файла
    PhoneBookName : String := "PhoneBook.txt";
    num : Integer := 4; --Номер строки, с которой нужно начать удаление
    col : Integer := 3; --Количество строк, которые нужно удалить
    Str_Num : Integer := 1; -- Номер текущей строки
    PhoneBook, Tmp_PhoneBook : File_Type;
begin
    col := num + col - 1; --col теперь содержит номер последней удаляемой строки
    --Открываем телефонную книгу для чтения:
    Open(File => PhoneBook, Mode => In_File, Name => PhoneBookName);
    --Создаём временный файл PhoneBook.txt.tmp для хранения промежуточных данных
    Create(File => Tmp_PhoneBook, Mode => Out_File, Name => (PhoneBookName & Tmp_Ext));
    while not End_Of_File(PhoneBook) loop --Пока не достигнут конец телефонной книги
        declare
            --На каждой итерации (при каждом проходе) создаётся строка, содержащая ровно
            --столько символов, чтобы вместить текущую строку файла
            str : String := Get_Line(File => PhoneBook);
        begin
            --если номер текущей строки меньше номера первой строки удаляемого блока
            --или больше номера последней строки удаляемого блока
            if Str_Num < num or else Str_Num > col then
                --То записываем эту строку во временный файл
                Put_Line(File => Tmp_PhoneBook, Item => str);
            end if;
        end;
        Str_Num := Str_Num + 1;
    end loop;
    Close(PhoneBook);
    Close(Tmp_PhoneBook);
    --Таким образом, временный файл теперь содержит все строки телефонной книги,
    --кроме тех, которые нужно было удалить. Поэтому дальше мы просто удалим
    --исходный файл и переименуем временный:
    Ada.Directories.Delete_File(Name => PhoneBookName);
    Ada.Directories.Rename(Old_Name => (PhoneBookName & Tmp_Ext), New_Name => PhoneBookName);
end main;

Удалить файл можно иначе, не используя пакет Ada.Directories. Для этого вместо Close(PhoneBook) можно написать Delete(PhoneBook). При этом файл будет удалён и связанная с ним переменная PhoneBook эту связь потеряет.

Как-то так. Некоторые языки программирования, например, C#, Perl, Python, решают эту же задачу более кратко, однако за краткостью кода в конечном итоге стоит примерно вот такая реализация этого алгоритма.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *