Ada 使用字符串分割时如何处理索引错误?

Ada 使用字符串分割时如何处理索引错误?,ada,Ada,引发GNAT.STRING\u SPLIT.INDEX\u错误 我已经尝试使用索引错误。但是,它怎么能读懂下一行呢。Ada似乎没有与nextLine类似的东西;就像java一样 with Ada.Text_IO; use Ada.Text_IO; with GNAT.String_Split; use GNAT.String_Split; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;

引发GNAT.STRING\u SPLIT.INDEX\u错误

我已经尝试使用索引错误。但是,它怎么能读懂下一行呢。Ada似乎没有与nextLine类似的东西;就像java一样

    with Ada.Text_IO;       use Ada.Text_IO;
    with GNAT.String_Split; use GNAT.String_Split;
    with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
    
    procedure TextFile is
    
    File   : File_Type;
    Tokens : Slice_Set;
    Index : Slice_Number;
   
    type Payrate_Type is delta 0.01 range 0.00 .. 1000.00;
    
    type Line_Info is record
        Code       : Unbounded_String := Null_Unbounded_String;
        Department : Unbounded_String := Null_Unbounded_String;
        Name       : Unbounded_String := Null_Unbounded_String;
        Title      : Unbounded_String := Null_Unbounded_String;
        ID         : Natural :=0;
        Payrate    : Payrate_Type:=0.00;
    end record;
    
    A_Line : Line_Info;
    
    package Payrate_IO is new Ada.Text_IO.Fixed_IO(Payrate_Type);
    
    Last : Positive;
begin
   Open (File, In_File, "Store.txt");
   -- Skip the file header
   Skip_Line (File);
   -- Read the data
   while not End_Of_File (File) loop
      -- Split the line from the file on array which contains separated
      -- words. Treat multiple spaces as a single separator (don't
      -- create empty elements).
      Create (Tokens, Get_Line (File), " ", Multiple);
      -- Print each of the array's values
        for I in 1 .. Slice_Count (Tokens) loop
        A_Line.Code       := To_Unbounded_String(Slice(Tokens, I));
        A_Line.Department := To_Unbounded_String(Slice(Tokens, I+1));
        A_Line.Name       := To_Unbounded_String(Slice(Tokens, I+2));
        A_Line.Title      := To_Unbounded_String(Slice(Tokens, I+3));
        A_Line.ID         := Natural'Value(Slice(Tokens, I+4));
        Payrate_IO.Get(Slice(Tokens,I+5),A_Line.Payrate,Last);
        end loop;
        

   end loop;
   
   exception
   when End_Error =>
      if Is_Open(File) then 
         Close (File);
      end if;
    end TextFile;
Store.txt

Code    Department  Name/Vendor  Title          ID      Payrate
IL      Sales       John         Sales_person   1378    25.46
IR      Crew        Jesse        Sales_person   1379    25.46

你的问题不在于你没有读到下一行。Get_line文件很好地做到了这一点

问题在于

for I in 1 .. Slice_Count (Tokens) loop
   A_Line.Code       := To_Unbounded_String(Slice(Tokens, I));
   A_Line.Department := To_Unbounded_String(Slice(Tokens, I+1));
   A_Line.Name       := To_Unbounded_String(Slice(Tokens, I+2));
   A_Line.Title      := To_Unbounded_String(Slice(Tokens, I+3));
   A_Line.ID         := Natural'Value(Slice(Tokens, I+4));
   Payrate_IO.Get(Slice(Tokens,I+5),A_Line.Payrate,Last);
end loop;
你应该试着向自己解释为什么你有一个循环


代码在哪个片中?工资率在哪一部分?第二次循环时会发生什么情况?

您的问题不在于无法读取下一行。Get\u line文件可以很好地完成这一操作

问题在于

for I in 1 .. Slice_Count (Tokens) loop
   A_Line.Code       := To_Unbounded_String(Slice(Tokens, I));
   A_Line.Department := To_Unbounded_String(Slice(Tokens, I+1));
   A_Line.Name       := To_Unbounded_String(Slice(Tokens, I+2));
   A_Line.Title      := To_Unbounded_String(Slice(Tokens, I+3));
   A_Line.ID         := Natural'Value(Slice(Tokens, I+4));
   Payrate_IO.Get(Slice(Tokens,I+5),A_Line.Payrate,Last);
end loop;
你应该试着向自己解释为什么你有一个循环


代码在哪个片中?工资率在哪一部分?第二次循环会发生什么?

我很惊讶你没有发现类似的东西,因为你已经在调用Skip_line我很惊讶你没有发现类似的东西,因为你已经在调用Skip_line我也在没有循环的情况下做了,并从SliceTokens开始编号,1到SliceTokens 6,A_line.Payrate,最后等等,并添加了跳过行。我仍然得到一个索引错误。你不需要调用Skip_Line;正如我所说,Get_Line做得很好。这对我来说毫无例外。你是对的。它起作用了。我发现错误来自于文件在该切片中找不到某些内容。我也在没有循环的情况下这样做,并从SliceTokens、1到SliceTokens 6、A_line.Payrate、Last等等对它们进行编号,并添加了跳过行。我仍然得到一个索引错误。你不需要调用Skip_Line;正如我所说,Get_Line做得很好。这对我来说毫无例外。你是对的。它起作用了。我发现错误来自文件在该切片中找不到某些内容。