www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - how stdin stream works?

reply Flade <consolemaster0 gmail.com> writes:
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");

     }
Aug 19 2020
parent reply Steven Schveighoffer <schveiguy gmail.com> writes:
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
Aug 19 2020
parent reply Flade <consolemaster0 gmail.com> writes:
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!
Aug 19 2020
parent reply =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
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
Aug 20 2020
next sibling parent Flade <consolemaster0 gmail.com> writes:
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!
Aug 23 2020
prev sibling parent Flade <consolemaster0 gmail.com> writes:
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!!!
Aug 23 2020