我想存储由数组中指定索引处的空格分隔的每个字符块。这是我的代码:
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
答案 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(索引)
这样您就可以将字符流分成几个数组
此外,请务必检查您的索引是否超出范围。