Sujet : Re: Whaddaya think?
De : already5chosen (at) *nospam* yahoo.com (Michael S)
Groupes : comp.lang.cDate : 16. Jun 2024, 09:11:34
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <20240616111134.00001f18@yahoo.com>
References : 1 2 3 4 5 6 7
User-Agent : Claws Mail 3.19.1 (GTK+ 2.24.33; x86_64-w64-mingw32)
On Sun, 16 Jun 2024 07:41:38 +0200
Janis Papanagnou <janis_papanagnou+
ng@hotmail.com> wrote:
On 16.06.2024 07:21, Keith Thompson wrote:
Janis Papanagnou <janis_papanagnou+ng@hotmail.com> writes:
On 16.06.2024 05:41, Janis Papanagnou wrote:
On 16.06.2024 05:26, Lawrence D'Oliveiro wrote:
On Sun, 16 Jun 2024 01:56:49 +0300, Michael S wrote:
If you want to preserve you sanity, never use fscanf().
>
Quoth the man page
<https://manpages.debian.org/3/scanf.3.en.html>:
>
It is very difficult to use these functions correctly, and
it is preferable to read entire lines with fgets(3) or
getline(3) and parse them later with sscanf(3) or more
specialized functions such as strtol(3).
>
This would be also my first impulse, but you'd have to know
_in advance_ how long the data stream would be; the function
requires an existing buffer. So you'd anyway need a stepwise
input. [...]
>
Would it be sensible to have a malloc()'ed buffer used for the
first fgets() and then subsequent fgets() work on the realloc()'ed
part? I suppose the previously set data in the malloc area would
be retained so that there's no re-composition of cut numbers
necessary?
Sure. "The contents of the new object shall be the same as that of
the old object prior to deallocation, up to the lesser of the new
and old sizes."
Keep in mind that you can't call realloc() on a non-null pointer
that wasn't allocated by an allocation function.
Thanks. - I've just tried it with this ad hoc test code
#include <stdlib.h>
#include <stdio.h>
void main (int argc, char * argv[])
{
int chunk = 10;
int bufsize = chunk+1;
char * buf = malloc(bufsize);
char * anchor = buf;
while (fgets(buf, chunk+1, stdin) != NULL)
if (realloc(anchor, bufsize += chunk) != NULL)
buf += chunk;
puts(anchor);
}
Not sure what this code is supposed to do.
However it looks unlikely that it does what you meant for it to do.
I recommend to read the [f*****g] manual.
https://cplusplus.com/reference/cstdio/fgets/https://cplusplus.com/reference/cstdlib/realloc/I wonder whether it can be simplified by making malloc() obsolete
and using realloc() in a redesigned loop.
Janis