Smartest way to read a number?

Tobias Brandt tob.brandt at googlemail.com
Thu Nov 10 14:52:43 PST 2011


Yes, you are right. You can make it work by changing to line buffering:

stdin.setvbuf(null, _IOLBF);

But at that point, another solution (like using std.conv.to) is
probably the better choice.

On 10 November 2011 23:40, Kai Meyer <kai at unixlords.com> wrote:
> I don't get the exception on Linux after a new line, I have to wait until
> EOF, which is typically the end of the program if reading from STDIN. Not
> very useful.
>
> import std.stdio;
>
> T readNumber(T)()
> {
>    T result;
>    stdin.readf("%s", &result);
>    return result;
> }
> void main()
> {
>    try
>    {
>        int n = readNumber!int();
>        writeln(n);
>
>        float f = readNumber!float();;
>        writeln(f);
>    }
>    catch(Exception e)
>    {
>        writeln(e.msg);
>    }
> }
>
>
> Sample execution:
> -----------------------
> [kai.meyer at kai-rhel6 D]$ dmd -run readnum.d
> a
> 1
> 1.2
> ** I hit Ctrl-D here, so this line isn't part of the output ***
> std.conv(1157): Can't convert value `a
> 1
> 1.2
> ' of type LockingTextReader to type int
> -----------------------
>
> Or if you prefer with out my terminal echoing my input:
> -----------------------
> [kai.meyer at kai-rhel6 D]$ echo -e 'a\n1\n1.2\n' | dmd -run readnum.d
> std.conv(1157): Can't convert value `a
> 1
> 1.2
>
> ' of type LockingTextReader to type int
> ----------------------
>
>
> On 11/10/2011 02:58 PM, Tobias Brandt wrote:
>>
>> import std.stdio;
>>
>> T readNumber(T)()
>> {
>>     T result;
>>     stdin.readf("%s",&result);
>>     return result;
>> }
>>
>> Throws a ConvException if the input string wasn't in the right format.
>>
>> On 10 November 2011 22:48, Fabian<talk2fab at online.de>  wrote:
>>>
>>> Hey guys.
>>>
>>> I just want to write a few console applications. Usualy I have to read
>>> numbers
>>> to calculate some values. But what's the smartest way to read and convert
>>> the
>>> input?
>>>
>>> I've coded these lines:
>>>
>>> import std.stdio, std.string, std.conv;
>>>
>>> T readNumber(T)()
>>> {
>>>        string buffer;
>>>        stdin.readln(buffer);
>>>        buffer = chomp(buffer);
>>>
>>>        if(isNumeric(buffer))
>>>        {
>>>                return parse!T(buffer);
>>>        }
>>>        else
>>>        {
>>>                throw new Exception("Input is not a number!");
>>>        }
>>> }
>>>
>>> void main()
>>> {
>>>        try
>>>        {
>>>                int n = readNumber!int();
>>>                writeln(n);
>>>
>>>                float f = readNumber!float();
>>>                writeln(f);
>>>        }
>>>        catch(Exception e)
>>>        {
>>>                writeln(e.msg);
>>>        }
>>> }
>>>
>>> Can I use that function or is there a cleaner way to do this job?
>>>
>>> Greetings
>>> Fabian
>>>
>
>


More information about the Digitalmars-d-learn mailing list