From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on ip-172-31-91-241.ec2.internal X-Spam-Level: X-Spam-Status: No, score=-1.0 required=3.0 tests=NICE_REPLY_A autolearn=ham autolearn_force=no version=3.4.6 Path: eternal-september.org!news.eternal-september.org!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Niklas Holsti Newsgroups: comp.lang.ada Subject: Re: Weird behavior of Get character with trailing new lines. Date: Fri, 22 Sep 2023 22:52:21 +0300 Organization: Tidorum Ltd Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Trace: individual.net WlHU6dS2N9DNwLp33WZKzwpMS+0AsxASSWK2x8g/ilqq2wYkGR Cancel-Lock: sha1:A3Fo7Yv8544ptIyxKAdRS+ErFdg= sha256:9uctbmxCWL8SmAzA5eal4rRqDg6y9oG9snRzShcFV0g= User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 Content-Language: en-US In-Reply-To: Xref: news.eternal-september.org comp.lang.ada:65695 List-Id: 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;