Ada从文件中读取一行字符并将它们存储在一个数组中

时间:2014-05-07 21:24:30

标签: arrays file-io io ada

我想存储由数组中指定索引处的空格分隔的每个字符块。这是我的代码:

with Ada.Text_IO; use Ada.Text_IO;

procedure Test_Read is

    Input_File    : File_Type;
    type Arr_Type is array (Integer range <>) of Character;
    Arr :   Arr_Type (1 .. 3);

begin

   Ada.Text_IO.Open (File => Input_File, Mode => Ada.Text_IO.In_File, Name => "input.txt");

    while not End_OF_File (Input_File) loop
        Ada.Text_IO.Get (File => Input_File, Item => Arr(1));
        Ada.Text_IO.Put (Item => Arr(1));
    end loop;

 Ada.Text_IO.Close (File => Input_File); 

end Test_Read;

文件“input.txt”包含:

ABCD EFGH IJK

我为Put(Arr(1))得到的输出是全线:

ABCD EFGH IJK

我想要Put(Arr(1))的输出是:

ABCD

2 个答案:

答案 0 :(得分:3)

首先,您的数据类型与问题不符。

类型Character包含单个(ISO-8859-1)字符。您的问题描述听起来像是希望能够将每个块存储为未指定数量的字符。类型Ada.Strings.Unbounded.Unbounded_String适用于此目的。

with Ada.Strings.Unbounded;
...
   type Block_Of_Characters is new Ada.Strings.Unbounded.Unbounded_String;

您的问题描述没有明确说明您期望的字符块数,但是现在我将假设您总是需要三个块(如示例数据和源文本都指示的那样)。

   type Block_Collection is array (Positive range <>) of Block_Of_Characters;
   Blocks : Block_Collection (1 .. 3);

打开数据文件看起来很好。

读取循环应该有点不同:

   Buffer : Character;
begin
   Open (File => Input_File,
         Mode => In_File,
         Name => "input.txt");

   for Index in Blocks'Range loop
      Read_A_Single_Block :
      loop
         exit when Index = Blocks'Last and End_Of_File (Input_File);

         Get (File => Input_File,
              Item => Buffer);

         exit Read_A_Single_Block when Buffer = ' ';

         Append (Source   => Blocks (Index),
                 New_Item => Buffer);
      end loop Read_A_Single_Block;
   end loop;

答案 1 :(得分:1)

自从我上次在Ada编程任何事情已经22年了,很清楚你没有检查空间。
从指向1的数组索引变量开始 你需要检查你得到的角色是否已经过了。使用Ada.Text_IO.Get是一个空格 如果是空格,请在索引中添加一个空格,并始终使用Arr(索引) 这样您就可以将字符流分成几个数组 此外,请务必检查您的索引是否超出范围。