Thread overview
calling fgets()
Dec 23, 2012
Red
Dec 23, 2012
bearophile
Dec 23, 2012
Mike Wey
Dec 24, 2012
Red
Dec 31, 2012
Regan Heath
December 23, 2012
How would I call the C library routine fgets() ?

char *fgets(char *s, int size, FILE *stream);

My problem is with the first argument. I am not sure what to declare and how to pass it. I tried doing it as you would in C, but it doesn't compile.
December 23, 2012
Red:

> My problem is with the first argument. I am not sure what to declare and how to pass it. I tried doing it as you would in C, but it doesn't compile.

Take a look at the toStringz function. But often using D functions is better than using C functions.

Bye,
bearophile
December 23, 2012
On 12/23/2012 02:36 PM, Red wrote:
> How would I call the C library routine fgets() ?
>
> char *fgets(char *s, int size, FILE *stream);
>
> My problem is with the first argument. I am not sure what to declare and
> how to pass it. I tried doing it as you would in C, but it doesn't compile.

If you declare an char array you could pass it's pointer and length as the first two arguments.

char[] buff = new char[1024];
fgets(buff.ptr, buff.length, someStream);
buff = buff[0 .. strlen(buff)];

-- 
Mike Wey
December 24, 2012
On Sunday, 23 December 2012 at 16:20:47 UTC, Mike Wey wrote:

>
> If you declare an char array you could pass it's pointer and length as the first two arguments.
>
> char[] buff = new char[1024];
> fgets(buff.ptr, buff.length, someStream);
> buff = buff[0 .. strlen(buff)];

Thanks, that does work (buff.length has to be cast to an int). Which is surprising. I would have thought that a char[] in D would not equate to a char array in C since the D char's are UTF-8,  and that a byte[] would have to be used (byte[] also works with a cast).
December 31, 2012
On Mon, 24 Dec 2012 12:00:05 -0000, Red <resmith@lavabit.com> wrote:

> On Sunday, 23 December 2012 at 16:20:47 UTC, Mike Wey wrote:
>
>>
>> If you declare an char array you could pass it's pointer and length as the first two arguments.
>>
>> char[] buff = new char[1024];
>> fgets(buff.ptr, buff.length, someStream);
>> buff = buff[0 .. strlen(buff)];
>
> Thanks, that does work (buff.length has to be cast to an int). Which is surprising. I would have thought that a char[] in D would not equate to a char array in C since the D char's are UTF-8,  and that a byte[] would have to be used (byte[] also works with a cast).

Technically you're more or less correct :)

But, if your input is all ASCII then as ASCII is a subset of UTF-8 it "just works".  If however your input is not ASCII, but say Chinese characters in a different encoding/locale then it will go "bang!" at some point, probably when you try to write it back to the screen or foreach over it.

Using ubyte[] is the technically correct method IMO.  Then in a perfect world you'd call a method to convert that ubyte[] from it's known (has to be known or detectable somehow) encoding into UTF-8 for use in your D code.

R

-- 
Using Opera's revolutionary email client: http://www.opera.com/mail/