www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Formatted read of tokens?

reply Jerry <jlquinn optonline.net> writes:
Hi all,

I'm porting some C++ code into D that uses istream to read lines like

label 3

where there can spaces or tabs between the 2 fields.  In c++, this is:

string l;
int i;
istr >> l >> i;

What's the equivalent in D?  It appears that D formatted read for
strings grabs everything up to a newline and doesn't support whitespace
tokenization.

If I do

f.readf("%s %s", &l, &i);

it fails if the whitespace is a tab.

Thanks
Jerry
Jun 17 2014
parent reply "bearophile" <bearophileHUGS lycos.com> writes:
Jerry:

 If I do

 f.readf("%s %s", &l, &i);

 it fails if the whitespace is a tab.
In you can use byLine, followed by a split, and then assignment of the pieces, followed by to!int where necessary. Bye, bearophile
Jun 17 2014
parent reply Jerry <jlquinn optonline.net> writes:
"bearophile" <bearophileHUGS lycos.com> writes:

 Jerry:

 If I do

 f.readf("%s %s", &l, &i);

 it fails if the whitespace is a tab.
In you can use byLine, followed by a split, and then assignment of the pieces, followed by to!int where necessary.
I actually can't use byLine in this instance. I'm really wanting the %s behavior of scanf().
Jun 17 2014
parent reply "John Colvin" <john.loughran.colvin gmail.com> writes:
On Tuesday, 17 June 2014 at 13:16:38 UTC, Jerry wrote:
 "bearophile" <bearophileHUGS lycos.com> writes:

 Jerry:

 If I do

 f.readf("%s %s", &l, &i);

 it fails if the whitespace is a tab.
In you can use byLine, followed by a split, and then assignment of the pieces, followed by to!int where necessary.
I actually can't use byLine in this instance. I'm really wanting the %s behavior of scanf().
If you really need/want fscanf behaviour then just use it: import core.stdc.stdio : fscanf;
Jun 17 2014
parent Jerry <jlquinn optonline.net> writes:
"John Colvin" <john.loughran.colvin gmail.com> writes:

 On Tuesday, 17 June 2014 at 13:16:38 UTC, Jerry wrote:
 "bearophile" <bearophileHUGS lycos.com> writes:

 Jerry:

 If I do

 f.readf("%s %s", &l, &i);

 it fails if the whitespace is a tab.
In you can use byLine, followed by a split, and then assignment of the pieces, followed by to!int where necessary.
I actually can't use byLine in this instance. I'm really wanting the %s behavior of scanf().
If you really need/want fscanf behaviour then just use it: import core.stdc.stdio : fscanf;
Thanks, I forgot the obvious. It would be nice to have a way to do the same thing in D formatted reading. Does it seem like it would be useful to specify this kind of thing? For example, you could have: %' ' grabs all isWhite() chars %t reads a single token - all chars !isWhite() Any takers? Jerry
Jun 17 2014