Thread overview
Command Line Input
May 12, 2005
Shom
May 12, 2005
Hasan Aljudy
May 12, 2005
John Reimer
May 12, 2005
SeeSchloss
May 12, 2005
Ben Hinkle
May 12, 2005
SeeSchloss
May 12, 2005
Ben Hinkle
May 12, 2005
Hi Everyone,

I just started messing around with D... and it totally kicks butt!
However, is there any easy way for command line input? I mean something simple
like the good old C/C++ cin >>

I would appreciate any help with this.

Thanks,

Shom


May 12, 2005
Shom wrote:
> Hi Everyone,
> 
> I just started messing around with D... and it totally kicks butt!
> However, is there any easy way for command line input? I mean something simple
> like the good old C/C++ cin >>
> 
> I would appreciate any help with this.
> 
> Thanks,
> 
> Shom
> 
> 

I'm new myself.
cin >> is a C++ thing, for now, D is stuck with the old C way, which is
scanf(...);

It would be nice if there was a cleaner way to do this (someone could write some sort of a wrapper?)
May 12, 2005
Hasan Aljudy wrote:

>> I just started messing around with D... and it totally kicks butt!
>> However, is there any easy way for command line input? I mean something simple
>> like the good old C/C++ cin >>
>>
>> I would appreciate any help with this.
> 
> I'm new myself.
> cin >> is a C++ thing, for now, D is stuck with the old C way, which is
> scanf(...);
> 
> It would be nice if there was a cleaner way to do this (someone could write some sort of a wrapper?)

You mean std.stdio.readf, which hasn't been added to DMD just yet...
("readf" is to "writef", what "scanf" is to "printf". i.e. the D way)

See http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D/21692

You should also check out the Mango Tree, which has stream classes.
(unfortunately Dsource is down at the moment, but when it comes back)

--anders
May 12, 2005
Anders F Björklund wrote:
> Hasan Aljudy wrote:
> 
>>> I just started messing around with D... and it totally kicks butt!
>>> However, is there any easy way for command line input? I mean something simple
>>> like the good old C/C++ cin >>
>>>
>>> I would appreciate any help with this.
>>
>>
>> I'm new myself.
>> cin >> is a C++ thing, for now, D is stuck with the old C way, which is
>> scanf(...);
>>
>> It would be nice if there was a cleaner way to do this (someone could write some sort of a wrapper?)
> 
> 
> You mean std.stdio.readf, which hasn't been added to DMD just yet...
> ("readf" is to "writef", what "scanf" is to "printf". i.e. the D way)
> 
> See http://www.digitalmars.com/drn-bin/wwwnews?digitalmars.D/21692
> 
> You should also check out the Mango Tree, which has stream classes.
> (unfortunately Dsource is down at the moment, but when it comes back)
> 
> --anders

Indeed.  Check Mango out. :-)

Anders,

Just looking at your example in your news link above:

read(&name); // without format
readf("%s", &name); // with format

I was curious to know why you chose to use the "address of" operator here.  Wouldn't it be better to use d's inout reference instead?  That ampersand is just as unattractive now in D as it has been in C for all these years.  I could be missing something, though.

-JJR
May 12, 2005
In article <d5uspi$2gsg$1@digitaldaemon.com>, Shom says...
>
>Hi Everyone,
>
>I just started messing around with D... and it totally kicks butt!
>However, is there any easy way for command line input? I mean something simple
>like the good old C/C++ cin >>
>
>I would appreciate any help with this.

Hmm, well I'm not sure how cin >> works, but std.stream.stdin.readLine () is
nice for reading stdin.

BTW, it'd be nice if importing std.stream didn't import some other std.c.<something ?> package which already defines std{in,out,err} as it requires to make an alias if one wants to simply use "stdin" instead of "std.stream.stdin".


May 12, 2005
John Reimer wrote:

> Just looking at your example in your news link above:
> 
> read(&name); // without format
> readf("%s", &name); // with format
> 
> I was curious to know why you chose to use the "address of" operator here.  Wouldn't it be better to use d's inout reference instead?  That ampersand is just as unattractive now in D as it has been in C for all these years.  I could be missing something, though.

variadic inout is not allowed ? Besides, using pointers make it
easier to separate the format strings and the string receptors...
(since there is no "const char *" and "char *" distinction in D)

Unfortunately it doesn't work very good, since TypeInfo for pointers
is not implemented yet. So it relies on some horrible workarounds now.
But when typeid for pointers works, it's simple to remove those...


readf is just intended as a improvement over scanf. Not a cure-all ?
(besides it seemed silly to have a "stdio" that only did O and not I)

Just as writef is an improvement over printf, but still somewhat ugly.
(but I think my new write/writeln addition fixes that, to some degree)

--anders
May 12, 2005
John Reimer wrote:

>> You should also check out the Mango Tree, which has stream classes.
>> (unfortunately Dsource is down at the moment, but when it comes back)
> 
> Indeed.  Check Mango out. :-)

Maybe I forgot to mention it, but Mango doesn't work on Mac OS X (yet).

Whileas scanf and readf (with some workarounds) do. That's it, for me.

--anders
May 12, 2005
"SeeSchloss" <SeeSchloss_member@pathlink.com> wrote in message news:d5v8mi$2u6a$1@digitaldaemon.com...
> In article <d5uspi$2gsg$1@digitaldaemon.com>, Shom says...
>>
>>Hi Everyone,
>>
>>I just started messing around with D... and it totally kicks butt!
>>However, is there any easy way for command line input? I mean something
>>simple
>>like the good old C/C++ cin >>
>>
>>I would appreciate any help with this.
>
> Hmm, well I'm not sure how cin >> works, but std.stream.stdin.readLine ()
> is
> nice for reading stdin.
>
> BTW, it'd be nice if importing std.stream didn't import some other
> std.c.<something ?> package which already defines std{in,out,err} as it
> requires
> to make an alias if one wants to simply use "stdin" instead of
> "std.stream.stdin".

That should work. For example
import std.stream;
int main() {
  char[] line = stdin.readLine();
  stdout.writefln("%s",line);
  return 0;
}
Is that what you mean?


May 12, 2005
>> BTW, it'd be nice if importing std.stream didn't import some other
>> std.c.<something ?> package which already defines std{in,out,err} as it
>> requires
>> to make an alias if one wants to simply use "stdin" instead of
>> "std.stream.stdin".
>
>That should work. For example
>import std.stream;
>int main() {
>  char[] line = stdin.readLine();
>  stdout.writefln("%s",line);
>  return 0;
>}
>Is that what you mean?

Yeah, that's what I mean.
And... ok I was just wrong, it's importing both std.stream and std.stdio, which
creates a conflict. I guess I never imported std.stream without std.stdio, and
since it happened just when adding the std.stream import, I never looked
anywhere else.

*hides in shame*


May 12, 2005
"SeeSchloss" <SeeSchloss_member@pathlink.com> wrote in message news:d5vt5l$emj$1@digitaldaemon.com...
>>> BTW, it'd be nice if importing std.stream didn't import some other
>>> std.c.<something ?> package which already defines std{in,out,err} as it
>>> requires
>>> to make an alias if one wants to simply use "stdin" instead of
>>> "std.stream.stdin".
>>
>>That should work. For example
>>import std.stream;
>>int main() {
>>  char[] line = stdin.readLine();
>>  stdout.writefln("%s",line);
>>  return 0;
>>}
>>Is that what you mean?
>
> Yeah, that's what I mean.
> And... ok I was just wrong, it's importing both std.stream and std.stdio,
> which
> creates a conflict. I guess I never imported std.stream without std.stdio,
> and
> since it happened just when adding the std.stream import, I never looked
> anywhere else.
>
> *hides in shame*

I agree it's annoying to have std.stdio and std.stream conflict. Maybe std.stream.stdin and friends need a rename...