Reading a line from stdin

Kai Meyer kai at unixlords.com
Wed Mar 16 09:38:06 PDT 2011


On 03/16/2011 07:54 AM, Ali Çehreli wrote:
> On 03/16/2011 05:49 AM, Kagamin wrote:
>> Ali ǥhreli Wrote:
>>
>>> The following program may be surprising to the novice:
>>>
>>> import std.stdio;
>>>
>>> void main()
>>> {
>>> write("What is your name? ");
>>> string name = readln();
>>> writeln("Hi ", name, "!");
>>> }
>>
>> What if the user typed leading spaces? Will the program operate as you
>> expect?
>
> I would not like the leading spaces either, and that's another issue:
> contrary to readln(), readf() leaves the newline character in the input.
> I was about to start adopting the guideline of using " %s" (note the
> space) when reading formatted unless there is a reason not to. Most of
> the time the newline left from the previous input has nothing to do with
> the next read.
>
> Otherwise the following program gets stuck:
>
> import std.stdio;
>
> void main()
> {
> int i, j;
> readf("%s%s", &i, &j);
> }
>
> As a result, my current guideline is "put a space before every format
> specifier":
>
> readf(" %s %s", &i, &j);
>
> This is a departure from C's scanf but is more consistent.
>
> I don't want to accept and teach buggy behavior and that's why I asked
> on the D forum. Unfortunately I failed to attract interest there.
>
> After accepting the above, I wanted to readf() lines too:
>
> import std.stdio;
>
> void main()
> {
> string s;
> readf(" %s", &s);
> writeln(s);
> }
>
> As another departure from C, readf() does not stop at the first
> whitespace. It reads until the end of the input. Ok, I like that
> behavior but it's not useful for "What is your name? " like inputs.
>
> So it led me to readln().
>
> I don't have a problem with whitespace being left in the line, I just
> want to know whether that's the intended or accepted behavior.
>
> Ali

I think there are two issues here. First, I think is perfectly 
reasonable to let the programmer use a simple mechanism like 
"string.chomp(stdin.readline())" or simply "chomp(readln())" when they 
don't want the new line.

Second, D doesn't seem to have a graceful way of reading an endless 
stream of <your favorite data type> delimited by <your favorite 
delimiting character>. I think readf is rigid, and works great in some 
cases. I would greatly appreciate something more flexible like C++'s 
extraction operator (operator>>) though. For example:
int i = 0;
while(cin >> i)
{
     //Do something
}
// Done doing something


More information about the Digitalmars-d-learn mailing list