| Deutsch English Français Italiano |
|
<87y0yepqg1.fsf@nosuchdomain.example.com> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!news.nobody.at!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: Keith Thompson <Keith.S.Thompson+u@gmail.com>
Newsgroups: comp.lang.c
Subject: Re: Buffer contents well-defined after fgets() reaches EOF ?
Date: Sun, 09 Feb 2025 16:57:02 -0800
Organization: None to speak of
Lines: 48
Message-ID: <87y0yepqg1.fsf@nosuchdomain.example.com>
References: <vo9g74$fu8u$1@dont-email.me> <vo9hlo$g0to$1@dont-email.me>
<vo9ki6$gib5$1@dont-email.me> <voahgv$mdud$2@dont-email.me>
<voaovv$ocot$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain
Injection-Date: Mon, 10 Feb 2025 01:57:03 +0100 (CET)
Injection-Info: dont-email.me; posting-host="f4acd3ba793eeb2facf0b27d62bf5cd0";
logging-data="945334"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/X5hCpJsy8blSYDR1sk5ri"
User-Agent: Gnus/5.13 (Gnus v5.13)
Cancel-Lock: sha1:1qSsYsxtSmu7JasvaiTHAsdmI0c=
sha1:efXvpjA9TvyLxT0SP2P+ulp0Ddg=
Bytes: 3204
Janis Papanagnou <janis_papanagnou+ng@hotmail.com> writes:
> On 09.02.2025 16:27, Andrey Tarasevich wrote:
[...]
>> Say, what do you want to see as "the
>> last line" in a file that ends with
>>
>> abracadabra\n<EOF here>
>>
>> ?
>>
>> Is "abracadabra" the last line? Or is the last line supposed to be empty
>> in this case?
>
> If "\n" is a string literal (2 characters, '\' and 'n') then it's an
> incomplete line (as to my standards), if it's meant as a <LF> control
> character then it's complete. (Similar with <CR> on old Apple/Macs and
> <CR><LF> on DOS-alike systems.)
It seems obvious to me that Andrey intended the \n to be a new-line
character (which is almost always LF in modern C implementations).
Here's (some of) what the C standard says about text streams:
A text stream is an ordered sequence of characters composed into
lines, each line consisting of zero or more characters plus a
terminating new-line character. Whether the last line requires
a terminating new-line character is implementation-defined.
For an implementation that *doesn't* require a new-line on the
last line, a stream without a trailing new-line is valid. For an
implementation that *does* require it, such a stream is invalid,
and a program that attempts to process it can have undefined behavior.
Most modern implementations don't require that trailing new-line.
For example, `echo -n hello > hello.txt` creates a valid text file.
Of course a C program that deals with text files can impose any
additional restrictions its author likes.
The above describes how a text stream looks to a C program. The
external representation can be quite different, with transformations
to map between them. The most common such transformation is
mapping the DOS/Windows CR-LF line terminator to LF on input, and
vice versa on output. Or the external representation might store
each line as a fixed-length character sequence padded with spaces.
--
Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com
void Void(void) { Void(); } /* The recursive call of the void */