Ада: чтение из файла - PullRequest
3 голосов
/ 20 марта 2012

Я пытаюсь прочитать файл с одним столбцом Long_Float значений в Ada следующим образом:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Long_Float_Text_IO;
with Ada.Sequential_IO;


procedure Test_Read is

  package Seq_Float_IO is new Ada.Sequential_IO (Element_Type => Long_Float);

  Input_File    : File_Type;
  value         : Long_Float;

begin

  Seq_Float_IO.Open (File => Input_File, Mode => Seq_Float_IO.In_File, Name => "fx.txt");
  while not End_OF_File (Input_File) loop
    Seq_Float_IO.Read (Input_File, value);
    Ada.Long_Float_Text_IO.Put (Item => value, Fore => 3, Aft  => 5, Exp  => 0);
  end loop;
  Seq_Float_IO.close (File => Input_File);

end Test_Read;

Я получаю много сообщений об ошибках при компиляции:

17.       Seq_Float_IO.Open (File => Input_File, Mode => Seq_Float_IO.In_File, Name => "fx.txt");
                                     |
    >>> expected private type "Ada.Sequential_Io.File_Type" from instance at line 10
    >>> found private type "Ada.Text_Io.File_Type"

18.       while not End_OF_File (Input_File) loop
19.         Seq_Float_IO.Read (Input_File, value);
                               |
    >>> expected private type "Ada.Sequential_Io.File_Type" from instance at line 10
    >>> found private type "Ada.Text_Io.File_Type"

Файл fx.txt содержит, например:

11.0
23.0
35.0
46.0

Любая помощь будет наиболее ценной.

Обновленный код:

with Ada.Text_IO; use Ada.Text_IO;


procedure Test_Read is

   Input_File    : File_Type;
   value         : Character;

begin

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

   while not End_OF_File (Input_File) loop
      Ada.Text_IO.Get (File => Input_File, Item => value);
      Ada.Text_IO.Put (Item => value);
      Ada.Text_IO.New_Line;
   end loop;
   Ada.Text_IO.Close (File => Input_File); 

end Test_Read;

Но теперь вывод:

1
1
.
0
2
3
.
0
3
5
.
0
4
6
.

Проблема в том, что value определяется как character. Если я хочу, чтобы value был типа Long_Float, чтобы я мог использовать числа 11.0, 23.0, 35.0 and 46.0 позже в моей программе, то как это сделать?

Спасибо.

1 Ответ

6 голосов
/ 20 марта 2012

По сути, вы создаете экземпляр Sequential_IO для ввода / вывода для двоичных значений, представляющих (длинные) числа с плавающей запятой. Это не то, что в вашем файле. Ваш файл содержит текстовые представления чисел с плавающей запятой.

В вашем примере избавьтесь от Sequential_IO и используйте обычный Text_IO.Open, чтобы открыть файл, и Long_Float_Text_IO для значений Get ().

Вот почему вы получаете сообщения об ошибках конфликта типов, вы пытаетесь выполнить операции Sequential_IO над переменной Long_Float_Text_IO File_Type.

...