Nп/п : 33 из 100
 От   : Niklas Holsti                       2:5075/128        22 сен 23 22:52:21
 К    : Blady                                                 22 сен 23 22:55:03
 Тема : Re: Weird behavior of Get character with trailing new lines.
----------------------------------------------------------------------------------
                                                                                 
@MSGID: <kn69jlFq9j6U1@mid.individual.net>
69a583e9
@REPLY: 1@dont-email.me> 4e5ef6ae
@REPLYADDR Niklas Holsti
<niklas.holsti@tidorum.invalid>
@REPLYTO 2:5075/128 Niklas Holsti
@CHRS: CP866 2
@RFC: 1 0
@RFC-Message-ID:
<kn69jlFq9j6U1@mid.individual.net>
@RFC-References: 1@dont-email.me>
@TZUTC: 0300
@PID: Mozilla/5.0 (Macintosh; Intel Mac OS X
10.14; rv:102.0) Gecko/20100101 Thunderbird/102.12.0
@TID: FIDOGATE-5.12-ge4e8b94
On 2023-09-22 22:30, Blady wrote:
> Hello,

> I`m reading a text file with Get character from Text_IO with a while 
> loop controlled by End_Of_File.

> % cat test_20230922_get_char.adb
> with Ada.Text_IO; use Ada.Text_IO;
> procedure test_20230922_get_char is
>     procedure Get is
>        F : File_Type;
>        Ch : Character;
>     begin
>        Open (F, In_File, "test_20230922_get_char.adb");
>        while not End_Of_File(F) loop
>           Get (F, Ch);
>           Put (Ch);
>        end loop;
>        Close (F);
>        Put_Line ("File read with get.");
>     end;
> begin
> Get;
> end;



> All will be well, unfortunately not!

> Despite the End_Of_File, I got an END_ERROR exception when there are 
> several trailing new lines at the end of the text:

> % test_20230922_get_char
> with Ada.Text_IO; use Ada.Text_IO;procedure test_20230922_get_char is 
> procedure Get is      F : File_Type;      Ch : Character;   begin Open 
> (F, In_File, "test_20230922_get_char.adb");      while not 
> End_Of_File(F) loop         Get (F, Ch);         Put (Ch);      end 
> loop;      Close (F);      Put_Line ("File read with get."); 
> end;beginGet;end;

> Execution of ../bin/test_20230922_get_char terminated by unhandled 
> exception
> raised ADA.IO_EXCEPTIONS.END_ERROR : a-textio.adb:517

> The code is compiled with GNAT, does it comply with the standard?

> A.10.7 Input-Output of Characters and Strings
> For an item of type Character the following procedures are provided:
> procedure Get(File : in File_Type; Item : out Character);
> procedure Get(Item : out Character);
> After skipping any line terminators and any page terminators, reads the 
> next character from the specified input file and returns the value of 
> this character in the out parameter Item.
> The exception End_Error is propagated if an attempt is made to skip a 
> file terminator.

> This seems to be the case, then how to avoid the exception?


In Text_IO, a line terminator is not an ordinary character, so you must 
handle it separately, for example like this:

       while not End_Of_File(F) loop
          if End_Of_Line(F) then
             New_Line;
             Skip_Line(F);
          else
             Get (F, Ch);
             Put (Ch);
          end if;





 --- Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:102.0)
Gecko/20100101 Thunderbird/102.12.0
 * Origin: Tidorum Ltd (2:5075/128)
SEEN-BY: 5001/100 5005/49 5015/255 5019/40 5020/715
848 1042 4441 12000
SEEN-BY: 5030/49 1081 5058/104 5075/128
@PATH: 5075/128 5020/1042 4441



   GoldED+ VK   │                                                 │   09:55:30    
                                                                                
В этой области больше нет сообщений.

Остаться здесь
Перейти к списку сообщений
Перейти к списку эх