2015-05-06 8 views
0

Я получаю путь к каталогу в строке, например "C:\Users\Me\Desktop\Hello”, и я пытаюсь получить последний каталог, но безуспешно.Обработка строк в ada

Я пробовал много манипуляции на струне, но в конце дня я ничего не оставил ... я буду благодарен за помощь. Благодаря !

Здесь была моя первая мысль:

Get_Line(Line, Len); 
while (Line /="") loop 
    FirstWord:=Index(Line(1..Len),"\")+1; 
    declare 
     NewLine :String := (Line(FirstWord .. Len)); 
    begin 
     Line:=NewLine ; 
    end; 
end loop; 

Я знаю, что он не работает (я не могу назначить NewLine для Line, потому что они не совпадают между их длины), и теперь я застрял.

ответ

8

Я предполагаю, что вы хотите управлять именами каталогов (и файлов), а не просто какой-либо старой строкой?

В этом случае вы должны смотреть на стандартной библиотеки пакетов Ada.Directories (ARM A.16) и Ada.Directories.Hierarchical_File_Names (ARM A.16.1):

with Ada.Directories; 
with Ada.Text_IO; use Ada.Text_IO; 
procedure Tal is 
    Line : constant String := "C:\Users\Me\Desktop\Hello"; 
begin 
    Put_Line ("Full_Name: " 
       & Ada.Directories.Full_Name (Line)); 
    Put_Line ("Simple_Name: " 
       & Ada.Directories.Simple_Name (Line)); 
    Put_Line ("Containing_Directory: " 
       & Ada.Directories.Containing_Directory (Line)); 
    Put_Line ("Base_Name: " 
       & Ada.Directories.Base_Name (Line)); 
end Tal; 

С другой стороны, если вы пытаетесь работать простой манипуляции со строками, вы могли бы использовать что-то вроде

with Ada.Strings.Fixed; 
with Ada.Text_IO; use Ada.Text_IO; 
procedure Tal is 

    function Get_Last_Word (From : String; 
          With_Separator : String) 
          return String is 
     Separator_Position : constant Natural := 
     Ada.Strings.Fixed.Index (Source => From, 
           Pattern => With_Separator, 
           Going => Ada.Strings.Backward); 
    begin 
     -- This will fail if there are no separators in From 
     return From (Separator_Position + 1 .. From'Last); --' 
    end Get_Last_Word; 

    Line : constant String := "C:\Users\Me\Desktop\Hello"; 

    Last_Name : constant String := Get_Last_Word (Line, "\"); 

begin 
    Put_Line (Last_Name); 
end Tal; 

Как вы можете видеть, поставив логику в Get_Last_Word позволяет поднять Last_Name из declare блока , Но никогда не удастся переписать фиксированную строку подстрокой (если вы не готовы справиться с завершающими пробелами, то есть): гораздо лучше никогда не попробовать.

+0

большое спасибо Simon !! – Tal