Thread overview
how stdin stream works?
Aug 19, 2020
Flade
Aug 19, 2020
Flade
Aug 20, 2020
Ali Çehreli
Aug 23, 2020
Flade
Aug 23, 2020
Flade
August 19, 2020
Hi everyone! I'm trying to do error handling (with the try block) and when I give a wrong value to the variable (it is an integer and I give a non-number value), then It doesn't let me re get input. The code:


int x;

bool not_accepted = false;

while (!not_accepted) {

    try {

        write("x: ");

        readf("%d\n", x);

        not_accepted = true;

} catch (Exception msg) {

        writeln("Please give a right coordinate");

    }
August 19, 2020
On 8/19/20 1:44 PM, Flade wrote:
> Hi everyone! I'm trying to do error handling (with the try block) and when I give a wrong value to the variable (it is an integer and I give a non-number value), then It doesn't let me re get input. The code:
> 
> 
> int x;
> 
> bool not_accepted = false;
> 
> while (!not_accepted) {
> 
>      try {
> 
>          write("x: ");
> 
>          readf("%d\n", x);
> 
>          not_accepted = true;
> 
> } catch (Exception msg) {
> 
>          writeln("Please give a right coordinate");
> 
>      }

Probably readf stops as soon as it encounters an error, meaning that your input is still present.

Try instead getting a line via readln, and then trying to read that into your expected input.

-Steve
August 19, 2020
On Wednesday, 19 August 2020 at 18:11:23 UTC, Steven Schveighoffer wrote:
> On 8/19/20 1:44 PM, Flade wrote:
>> Hi everyone! I'm trying to do error handling (with the try block) and when I give a wrong value to the variable (it is an integer and I give a non-number value), then It doesn't let me re get input. The code:
>> 
>> 
>> int x;
>> 
>> bool not_accepted = false;
>> 
>> while (!not_accepted) {
>> 
>>      try {
>> 
>>          write("x: ");
>> 
>>          readf("%d\n", x);
>> 
>>          not_accepted = true;
>> 
>> } catch (Exception msg) {
>> 
>>          writeln("Please give a right coordinate");
>> 
>>      }
>
> Probably readf stops as soon as it encounters an error, meaning that your input is still present.
>
> Try instead getting a line via readln, and then trying to read that into your expected input.
>
> -Steve

Thanks Steve! I will get the input a string then as you said and then I'll try to convert it! Thanks a lot, have a nice day!
August 20, 2020
On 8/19/20 11:46 AM, Flade wrote:

>> Try instead getting a line via readln, and then trying to read that into your expected input.
>>
>> -Steve
> 
> Thanks Steve! I will get the input a string then as you said and then I'll try to convert it! Thanks a lot, have a nice day!

In some cases clearerr() and readln() may be what is needed:

import std.stdio;

void main() {
  int x;

  bool accepted = false;

  while (!accepted) {
    try {
      write("x: ");
      readf(" %d", x);
      accepted = true;

    } catch (Exception msg) {

      writeln("Please give a right coordinate");
      stdin.clearerr();
      stdin.readln();
    }
  }

  writeln("x is ", x);
}

Note that I used " %d" because "%d/n" would not clean when nothing was input by just hitting the Enter key. A space character in the format string means "read and ignore any whitespace at this point" and I like it. :)

Also note I changed the name of the variable as 'accepted'. :)

Ali
August 23, 2020
On Thursday, 20 August 2020 at 19:13:31 UTC, Ali Çehreli wrote:
> On 8/19/20 11:46 AM, Flade wrote:
>
>> [...]
>
> In some cases clearerr() and readln() may be what is needed:
>
> import std.stdio;
>
> void main() {
>   int x;
>
>   bool accepted = false;
>
>   while (!accepted) {
>     try {
>       write("x: ");
>       readf(" %d", x);
>       accepted = true;
>
>     } catch (Exception msg) {
>
>       writeln("Please give a right coordinate");
>       stdin.clearerr();
>       stdin.readln();
>     }
>   }
>
>   writeln("x is ", x);
> }
>
> Note that I used " %d" because "%d/n" would not clean when nothing was input by just hitting the Enter key. A space character in the format string means "read and ignore any whitespace at this point" and I like it. :)
>
> Also note I changed the name of the variable as 'accepted'. :)
>
> Ali

Thanks a lot! Very useful info!!! And sorry for answering so late, I wasn't expecting someone to answer so I wasn't checking. Have a great day my friend!
August 23, 2020
On Thursday, 20 August 2020 at 19:13:31 UTC, Ali Çehreli wrote:
> On 8/19/20 11:46 AM, Flade wrote:
>
>>> [...]
>> 
>> Thanks Steve! I will get the input a string then as you said and then I'll try to convert it! Thanks a lot, have a nice day!
>
> In some cases clearerr() and readln() may be what is needed:
>
> import std.stdio;
>
> void main() {
>   int x;
>
>   bool accepted = false;
>
>   while (!accepted) {
>     try {
>       write("x: ");
>       readf(" %d", x);
>       accepted = true;
>
>     } catch (Exception msg) {
>
>       writeln("Please give a right coordinate");
>       stdin.clearerr();
>       stdin.readln();
>     }
>   }
>
>   writeln("x is ", x);
> }
>
> Note that I used " %d" because "%d/n" would not clean when nothing was input by just hitting the Enter key. A space character in the format string means "read and ignore any whitespace at this point" and I like it. :)
>
> Also note I changed the name of the variable as 'accepted'. :)
>
> Ali

Wait! Oh man I just checked your name!!!! I'm currently reading your book and I wanted to say that you did an EXCELLENT work and I love it! Thanks a lot! You are great!!!