Только чтение одного входа из файла в ada

У меня возникли проблемы с чтением ввода из файла. Итак, что я сделал, так это сделал программу проверки концепции, которая является частью моей основной программы, которая делает гораздо больше, но у меня только проблемы с чтением ввода. Вот мое доказательство концептуальной программы:

WITH Ada.Text_IO; USE Ada.Text_IO;
with ada.Integer_Text_IO; use ada.Integer_Text_IO;
PROCEDURE Open_File IS

subtype idnum is string(1 ..7);
   -- Make short names so that we can show where things come from

   My_File : File_Type;                  -- Name for file in this program
   Os_Name : String        := "My_Data.txt"; -- OS name for the file
   N       : idnum;                        -- Temporary for reading and printing file contents
   EOL : boolean;
   C : character;
BEGIN

   -- Open will raise an ADA.IO_EXCEPTIONS.NAME_ERROR expection
   -- if the file does not exist.

   Open (File => My_File, Mode => In_File, Name => Os_Name);

   LOOP
      EXIT WHEN End_Of_File (My_File);

      Look_Ahead(My_File, C, EOL);
      IF EOL THEN
         Skip_Line;
      ELSE
         IF C = ' ' THEN 
            Get(My_File, C);
         ELSE
            Get (My_File, N);
            Put_Line(N);
         END IF;
      END IF;         
   END LOOP;

   Close (My_File);
END open_file;

Мой файл данных выглядит так: (включая пробелы без новых строк после последнего идентификатора)

1234567

       456784a

   6758abc

Когда я компилирую и запускаю свою программу, на экран выводится только первый номер идентификатора. Я понятия не имею, где проверить мой код, потому что он должен продолжать получать идентификационные номера до конца файла.

Любая помощь будет принята с благодарностью. Спасибо!


person EPKasper    schedule 05.11.2014    source источник
comment
Что произойдет, если вы встретите пустую строку? (также у вас отсутствует END IF.)   -  person Alexis Wilke    schedule 06.11.2014
comment
а C и EOL нигде не определены   -  person egilhh    schedule 06.11.2014
comment
Я исправил END IF; часть, и он по-прежнему не читает ничего, кроме первой строки. Я изменил порядок переключения моего файла данных, чтобы перед первым идентификатором была пустая строка, и он по-прежнему читает только первый идентификатор. Обновление: также объявлены EOL и C   -  person EPKasper    schedule 06.11.2014


Ответы (1)


При Get второй (и третьей, если уж на то пошло) строке будет возбуждено исключение Data_Error, поскольку 456784a не является числом, а 'a' не является числовым символом. Если вы хотите, чтобы это было шестнадцатеричное число, ввод должен быть 16#456784a# (по умолчанию).

person egilhh    schedule 05.11.2014
comment
Также в обновленной версии вместо целого числа, которое я читаю, есть идентификатор подтипа, который представляет собой строку длиной 7. Однако проблема остается той же. - person EPKasper; 06.11.2014
comment
Подсказка: вы вызываете Open, End_Of_File, Look_Ahead, Get и Close с My_File. Для какого файла вы тогда пропускаете строку? - person egilhh; 06.11.2014
comment
Ах, да, спасибо, я понятия не имел о skip_line с параметрами, вау, я не могу поверить, что это было так просто. - person EPKasper; 06.11.2014